android Process/Thread 总结

Title Link
process and thread http://developer.android.com/guide/components/processes-and-threads.html
bound service http://developer.android.com/guide/components/bound-services.html
进程间通信AIDL http://developer.android.com/guide/components/aidl.html

默认情况下,在同一个应用中,只有一个进程,和一个主线程,但是也可以自行安排组件运行在单独的

进程中,或者开启一个新的线程.
可以在 mafinfest 中指定进程的类型,<activity>,<service>,<receiver>,<provider>都支持指定属性
android:process 让该组件运行在一个单独的进程中.

如:

 <service  
        android:name="com.example.servicetest.MyService"  
        android:process=":remote" >  
 </service>  



 在<application>中也可以指定该属性,为所有组件指定默认值


 在Android 系统中如果因为内存等系统资源不足时,系统将会选择一些进程杀死.挑选进程有一个

 等级制度,在挑选进程过程中,越在下面等级的进程越先被杀死.


1.Foreground process

如果一个进程满足以下条件中的任何一个,便属于前台进程:

1.它承载的Activity,用户正在进行交互 : onResume()调用

2.它承载的Service与一个正在和用户交互的Activity绑定

3.它承载的Service运行在前台--调用了 startForeground()

4.它承载的Service执行它生命周期中的调用 : onCreate(), onStart(), onDestroy()

此级别是最后被杀死的进程,一般是内存资源实在太小,前台进程不能全部执行,需要杀死部分获得用户接口的

相应.


2.Visible process

如果一个进程没有前台的组件,但是仍然在屏幕上对用户有影响,属于 visible process 满足:

1.它承载的Activity不在前台,但是仍然可见 onPause()中.比如 被Dialog部分遮挡.

2.它承载的Service与一个 visible/foreground Activity 绑定


3. Service process

一个进程中有通过 startService() 开始,正在运行的 service 没有被划分到上面两种类型.这类进程虽然

对于用户来并不能直观看见,但是可能执行一些用户比较在意的任务,比如下载数据.


4.Background process

进程承载的Activity对于用户不可见  :onStop() 中,对于用户体验来说没有什么影响,这一类进程很多

所以它们会在一个 LRU (least recently used )list 中,确保最少使用的进程先被杀死, 如果acvityi的生命周期中

的方法很好的调用,杀死该进程对用户视觉效果并不会有很大影响.


5.Empty process

进程不承载任何活动的组件,容许这类进程存在的唯一原因是缓存,提升一个组件下一启动速度,这类进程虽然

经常被杀死.


1.如果一个进程满足多个等级的条件,则它的等级为其中最高的等级.

2.一个为其它进程服务的进程永远不会比它服务的进程的等级低.

3.因为承载运行中的service 比在后台的acitivity的进程的优先级高,可以将一些任务放在service而不是activity

的子线程中,因为即使用户离开了activity也能保证任务至少有 service process 的等级.


Thread


主线程负责对用户接口组件事件的调度,比如绘图事件,同时也是应用中组件与 Android UI ToolKit 交互的
线程,也成为UI线程.

1.不要阻塞主线程
2.不要在子线程进行UI操作

有几个方法可以在子线程中通过UI线程更改UI:

1.Activity.runOnUiThread(Runnable)
2.View.post(Runnable)
3.View.postDelayed(Runnable, long)

比如:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            final Bitmap bitmap =
                    loadImageFromNetwork("http://example.com/image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值