【Processes and Threads】
当一个应用程序组件开始,应用程序没有任何组件在运行,Android系统开启一个新Linux进程为应用程序伴随一个单独的执行线程。默认,所有同一个进程所有组件运行在同一个进程 和线程(称为主线程)。如果一个应用程序组件开启并且已经有一个那个应用中程序的进程(因为另一个这个应用程序的组件存在),那么组件使用同一个线程。可是,你可以安排不同的组件在你的应用程序里运行在不同的进程,并且你可以为任何进程创建线程。
【Processes】
默认,同一应用程序的所有组件运行在同一个进程,大多数应用不应当改变这点。可是,如果你发现你需要控制哪一个组件属于哪一个进程,你可以在manifest文件里做。
每种类型的manifest入口点<activity>、<service>、<receiver>、<provider>--支持一个android:process属性能指定运行进程。你可以调这个属性以便每个组件运行在它自己的进程 或一组组件共享同一个进程而其它的不是。你也可以设置android:process以便不同应用程序的组件运行在同一个进程--前提是两个应用程序共享同一个Linux UID并且使用同样的证书签名。
<application>元素也支持 android:process属性,来设置适用所有组件的默认值。
Android可能会在某个点关闭进程 ,当内存少。应用程序组件运行在被杀死的进程里被最终销毁。一个进程被再开启这些组件,当又有工作要他们来做。
当决定哪个进程被杀死,Android系统衡量。例如,关闭一个拥有不再可见的activity的进程比较容易接受,和拥有可见activity的进程相比。是否删除进程决定于运行于其内的组件。
【Process lifecycle】
Android系统尝试尽量维护应用程序进程,但最终需要移除老的进程来为新的和更重要的进程分配内存。
在重要级别图中共有五个等级。下面按重要程序展现不同类型的进程(第一个进程最重要)
1、Foreground process
2、Visible process
3、Service process
4、Background process
5、Empty process
【Threads】
当一个应用程序启动,系统创建一个线程执行应用程序,叫做“主线程”。这个线程非常重要,因为它管理事件分发给合适的用户接口widget,包括绘图事件。它也是你的应用程序同Anroid UI 工具包组件交互的线程(从android.widget和android.view包中的组件)。这样,主线程也叫做UI线程。
系统不创建单独的线程为每个组件。所有组件在同一个进程的组件都是UI线程的实例,系统调用各个组件都是从这个线程分发。结果是,响应系统调用的方法(如onKeyDown()等)都运行在UI线程里。
Android UI 工具包不是线程安全的,你必须操作你的UI在UI线程。有两条简的规则对Android线程模型:
1、不要阻塞UI线程
2、不要在UI线程外操作Android UI工具。
【Worker threads】
如果你有非即时的操作,你应该让他们在单独的线程工作(背景线程或工作线程)。
下面是单击按钮,响应下载事件的事例:
上例违反了第二条规则,在非UI线程中操作UI。
【Using AsyncTask】
……(此处省略250字)