Andorid 进程和线程的区别 & android IPC(跨进程通信)方式 - 学习记录

一、进程和线程的区别

1.区别

角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是CPU调度的单位。
资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。
独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
开销方面。进程切换的开销较大。线程相对较小。

2.细节

进程

①. 默认情况下,一个应用程序的所有组件(activity、service、receiver和 provider)都运行在同一进程中。

②. 每种组件元素都可以通过在manifest中组件标签下添加android:process来指明这个组件运行在某一个特定的进程中。

③. 进程按重要程度被分为5个层次:前台进程、可见进程、服务进程、背景进程、空进程。

④. 在系统内存不足并且其他应用需要内存的时候,Android系统可能会终止一些进程。运行在这些进程中的组件也会同时被毁。这些组件重新启动的时候进程也会重新启动。

扩展:IPC进程间通信机制

线程

①. 每个应用程序(进程)都有一个主线程(通常为UI线程)和多个子线程。

②. UI线程不是线程安全的,耗时操作出现在UI线程将造成"ANR"异常。

③. 主线程是运行四大组件以及处理它们和用户的交互。

④. 子线程负责执行耗时操作。

⑤. 从子线程访问UI线程方法:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler
AsyncTask

扩展:线程池

 

二、IPC 的几种方式

1.  Intent / Bundle 

Activity,Service,Receiver 都支持在 Intent 中传递 Bundle 数据,而 Bundle 实现了 Parcelable 接口,可以在不同的进程间进行传输。而 intent.putExtra()方法内部实现是通过Bundle.putXXX()实现。故Intent 和 Bundle都可以实现跨进程通信。

2.  文件共享

对同一个文件先后写读,从而实现传输,Linux机制下,可以对文件并发写,所以要注意同步。顺便一提,Windows下不支持并发读或写。可以在一个进程中序列化一个对象到文件系统中,在另一个进程中反序列化恢复这个对象。SharedPreferences 是个特例,系统对它的读 / 写有一定的缓存策略,即内存中会有一份 ShardPreferences 文件的缓存,系统对他的读 / 写就变得不可靠,当面对高并发的读写访问,SharedPreferences 有很大的几率丢失数据。因此,IPC 不建议采用 SharedPreferences。

3.  Messenger:

Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

4.  AIDL

AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。通过编写aidl文件来设计想要暴露的接口,编译后会自动生成响应的java文件,服务器将接口的具体实现写在Stub中,用iBinder对象传递给客户端,客户端bindService的时候,用asInterface的形式将iBinder还原成接口,再调用其中的方法。

5.  ContentProvider:

系统四大组件之一,底层也是Binder实现,主要用来为其他APP提供数据,可以说天生就是为进程通信而生的。自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse("content://authorities")。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。

6.  Socket:

学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。

IPC 学习成果实例: https://github.com/dengdongqi/IPC_APP

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值