Android进程和线程

以下是阅读Android官方文档Processer and Threads这一章节的一些总结,之前有些模糊的地方这次看明白一些,希望对大家有所帮助:


进程:
1.当一个应用程序的组件启动,并且没有别的组件运行的时候,Android系统会启动一个新的Linux进程(包含一个线程)为这个应用程序。默认的一个应用程序内部的所有组件都运行在一个进程和线程中。如果应用程序启动一个已经有进程运行的组件,那么这个组件将运行在同样的进程中和线程。但是,同样可以再一个应用程序内部使不同的组件运行在不同的进程中,并且在进程内部创建不同的线程。
2.定义不同的组件运行在不同进程上,需要些manifest文件: <activity> <service> <receiver> , 和 <provider>标签都是支持 android:process属性来定义一个组件在哪个进程中。
3.Android系统会移除旧的进程来为更重要的进程释放内存,为了决定哪些进程被杀掉,系统会把每个进程放到 "importance hierarchy"  (重要性层级,基于进程中运行的组件和他们的状态),重要性低的进程会被优先kill掉。重要性层级有五个级别:
(1)前台进程:这种进程需要用户当前交互,满足以下的条件被认为是前台进程:
a.包含和用户交互的Activity的进程(Activity的onResume()方法已经被调用)。
b.包含和用户交互的Activity绑定的Service。
c.运行在前景的Service(已经调用了startForeground())。
d.执行了声明周期回调方法的Service(onCreate(),onStart(),onDestroy())。
e.包含已经执行onReceive()方法的BeoadcastReceiver。
(2)可视进程:没有包含前台组件的进程,但是仍然能被用户看到,满足以下条件:
a.非前景的Activity,但是仍然可见(onPause()已经被执行)。比如前景的Activity开启了一个dialog。
b.包含绑定了前景Activity的service。
(3)Service进程:通过startService()方法启动的Service。虽然他们不直接和用户交互,但是他们执行的动作是用户关心的(比如播放音乐)。
(4)后台进程:包含不可见的Activity(onStop()方法已经执行)。如果一个Activity正确的执行它生命周期的回调,并且保存了当前的状态,杀掉这个进程将不会产生直观的影响,因为当用户回到Activity,它会把保存的状态重置。
(5)空进程:不包含任何活跃的应用程序组件。
总结:
a.Android系统会尽量把一个进程的重要级别提高。一个进程的重要级别不会低于依靠他的组件的重要级别。
b.因为包含service的进程重要级别高于后台Activity的级别,所以一个activity创建一个长时间的操作最好能开启一个service,而不是简单的创建一个线程。同样的,broadcast receiver包含耗时操作的时候,应该开启一个services。

线程:
1.应用程序启动的时候,会创建一个主线程(main),这个线程同样会和UI tollkit( android.widget  和  android.view包下 )交互,所以也叫UI线程。
2.系统不会创建额外的线程,所有的组件都在这个线程上运行,系统回调的方法也在这个线程上(如onKeyDown()),所以耗时操作会block住整个UI,超过5s就会  "application not responding " (ANR) 
3.因为UI组件不是线程安全的,所以不能再UI线程之外的线程(工作线程)来操作UI组件。如果要从其他线程进入UI线程,有以下方法:
a.Activity.runOnUiThread(Runnable)
b.View.post(Runnable)
c.View.postDelayed(Runnable, long)
为了和UI线程进行复杂交互,可以考虑在工作线程使用Handler,或者使用继承AsyncTask类来和UI线程交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值