进程与线程
一.概述
当android的一个app的某个组件启动时,而这时候该app的其他组件还没启动,也就是从android系统开机后app第一次启动时。android系统会为该app分配一个Linux进程(process),以及一个主线程(main thread)。如何在改进程的主线程里运行该app及其组件。默认情况下app的组件都是运行在主进程里的。当然,我们可以为app的组件开辟一个新的进程来运行。可以在进程里开启多个线程。
二.进程
1.android的同一个app的组件默认运行在同一个进程里,但是我们可以通过在manifest里设置该组件运行的进程。可以使同一个app的组件运行在不同进程里,也可以使不同app的组件运行在相同的进程里(通过共享UID)。
2.android系统会在系统资源紧缺的情况下kill掉相对不那么重要的进程,比如一个运行在后台的app的重要性就比运行在前台与用户交互的app重要性低。当系统要kill掉某个进程时,就会把在该进程里的组件给一起kill掉。
3.进程优先级(优先级最高的在最前)
1.前台进程:即用户正在交互的进程,有如下情况
1.该进程的activity正在和用户交互
2.该进程的service与正在和用户交互的activity连接bound
3.该进程的service运行在前台,即该service里调用了startForeground()
4.该进程的service正在执行其生命周期里的函数(onCreate(),onStart(),onDestroy())
5.该进程的BroadcastReceiver正在执行onReceiver()方法。
2.可见进程:该进程不是前台进程,但该进程会影响用户在屏幕上所看到的。有如下情况
1.该进程的activity不是在前台,但是仍然可以可见它。如采用透明背景的activity后面的activity。
2.该进程的service和一个可见的activity相关联bound。
3.服务进程:该进程的service通过startService()启动了。结果service所做的事跟用户所看的没什么大关联,但是 它仍然在做一些用户可能在意的事情,比如在后台播放音乐,下载网络资源等。对于这样的进程,系统不会kill它, 除非非得杀死它才能保证前台进程和可见进程的执行。
4.后台进程:对于那些activity不在前台与用户交互的app进程,系统会在需要时kill它(为了保证前台进程,可见 进程,服务进程的执行)。对于那些已经在后台的app,系统所以LRU算法来管理,越久没被用户操作的进程越容 易被kill掉。
5.空进程:指的是那些没有app组件运行的进程,系统暂时保留它们的原因是为了线程需要使用到进程时那个快速 使用而不需要去向Linux申请。android会平衡系统资源的情况下选择kill掉空进程。
4.一个后台的service比一个后台activity的优先级高。所以当一个activity需要做一些耗时的操作时,最后是启动一个service而不是启动一个工作线程,特别是那些当离开该activity后还需要执行的操作,如上传文件到网络上时。
三.线程
1.主线程也叫UI线程,android默认对所以启动的组件都运行在主线程上,且系统对它们的调遣都是在主线程里做的, 所以系统的许多回调函数都是发生在UI线程里的,如生命周期函数的回调,onKeyDown()等
2.主线程的任务有,对点击事件的分发;绘图;同时也是用户与UI交互的线程;
3.当主线程里某个耗时操作超过5秒没放映的话,系统就会ANR。
4.因为android的UI操作是非线程安全的,所以不能在其他线程里直接操作UI
5.android原生提供的在其他线程操作UI的方法有
1.Activity.runOnUIThread(Runnable)
2.view.post(Runnable)
3.view.postDelay(Runnable)
4.handler
5.AsynTask