导航

转载:Android基础之Process

Posted on 2013-12-03 16:56  littledrop  阅读(159)  评论(0编辑  收藏  举报

进程

默认情况下,同一个应用程序中的所有组件运行在同一个进程中,而且绝大多数的应用程序也都是这样的。但是,如果我们想要控制让某个特定的组件属于某个进程,我们可以在manifest文件中进行配置。

在每种组件元素(activity、service、receiver、provider)的manifest条目中,都支持一个“android:process”的属性,通过这个属性,我们可以指定某个组件运行的进程。我们可以通过设置这个属性,让每个组件运行在它自己的进程中,也可以只让某些组件共享一个进程。我们要可以通过设置“android:process”属性,让不同应用程序中的组件运行在相同的进程中,这些应用程序共享相同的Linux用户ID,拥有相同的证书。

<application>元素也有一个“android:process”属性,可以设置一个应用于全部组件的默认值。

    当可用内存数量低,而一些与用户即时交互的进程又需要内存时,Android随时可能会终止某个进程。运行在被终止的进程中的组件会因此被销毁,但是,当再次需要这些组件工作时,就会再启动一个进程。

    在决定要终止哪个进程时,Android系统会权衡它们对于用户的重要性。例如,相较于运行可见activities的进程,终止一个运行不可见activities的进程会更加合理。是否终止一个进程,依赖于运行在这个进程中的组件的状态。

 

进程生命周期

Android系统会尽可能让一个应用程序进程运行更长的时间,但是它也需要移除旧的进程,为那些新创建的进程或者相比起来更加重要的进程释放内存空间。要决定哪个进程保留,哪个进程终止,系统会将每个进程放置到“importance hierarchy”中,“importance hierarchy”是基于运行在进程中的组件以及这些组件的状态的。拥有最低重要性的进程会首先被干掉,然后就是那些次低重要性的进程,依次类推。

在“importance hierarchy”中,共有五个等级。下面的列表中,按照重要性列出了五种不同类型的进程:

1、 前台进程(Foreground process)

2、 可见进程(Visible process)

3、 服务进程(Service process)

4、 后台进程(Background process)

5、 空进程(Empty process)

 

Android process与Thread 的问题

public class Activity2 extends Activity
{
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);

 


new Thread()
{
public void run()
{
dosomething();

}
}
.start();

}
在启动新线程时,出现如下错误:

W/ActivityManager( 81): Launch timeout has expired, giving up wake lock!
W/ActivityManager( 81): Activity idle timeout for HistoryRecord

解决办法:为相应的Activity1及Activity2增加Android:process属性,强制使两个Activity处于不同的应用程序私有进程之中。

问题出现的具体原因待进一步研究。

/guide/topics/manifest/activity-element.html

<Activity>元素 Android:process属性定义了运行Activity所在进程的名称。通常,一个应用程序的所有组件运行在应用程序创建的默认的进程。它具有与应用程序包相同的名称。<application>元素的android:process属性可以为所有组件设置不同的默认进程名称。但是,每个组件都可以覆盖默认设置,让应用程序跨多个进程。

如果分配给此属性的名称以一个冒号(':')开头,发将创建一个新的属于应用程序的私有的进程,在这一进程中运行。

如果进程的名称由小写字母开始,活动将在该名称的全局进程中运行,只要它有这样做的权限。这样做将使在不同的应用程序中的组件共享一个进程,减少资源的使用。


关于进程和线程参见http://freeworker.sinaapp.com/?p=25
 
上面两篇转自