Android 多进程、进程间通信(IPC)的几种方式

多进程

  • 进程是系统资源分配的最小单位,进程间的资源和数据相互隔离
  • 多进程使用场景
    将一些臃肿的组件放到单独的进程中,防止影响主进程的运行,例如webview、视频合成等
  • 多进程的影响
    • Application会被多次创建
    • 数据共享失效(对象、单例、回调)
      • 静态变量和EventBus不支持进程间通信的原因在于,不同的进程会有各自的jvm,也就导致不是同一个EventBus对象。
  • 进程间通信(IPC,Inter Process Communication)
    进程间通过内核提供的机制完成数据交换,称为进程间通信。

启动多个进程

  • 例如:将自己封装的CommonWebViewActivity在一个单独的进程中启动
    使用android:process
        <activity
            android:name=".activity.CommonWebViewActivity"
            android:process=":webview"
            android:screenOrientation="portrait" />
  • 需要特别说明的是,android:process=":webview" 中的webview名字是自定义的,而冒号":"的含义是当前进程名前附加上当前的包名。那么刚刚所创建出的Activity的完整进程名就为com.example.zhangyu:webview
    当然你也可以自己设置完整地进程名,如android:process="com.example.process:webview"这便是一种完整地命名方式。
    • 以:开头的进程,是APP的私有进程,不允许其他APP的组件来访问。
    • 如果这个进程的名字是以小写字符开头的,则这个服务将在一个以该名字命名的全局的进程中运行。当然前提是,它要有相应的权限,这将允许它在不同应用中的各个组件可以共享一个进程。从而减少资源的占用。
  • Application多次创建
    不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application

进程间通信方式(同一个app下)

  • 例如同一app下的两个不同进程下的activity
  • 使用Intent来传值和回传(就像在同一个进程中一样)
  • 使用SharedPreference

进程间通信方式(不同app间)

  • Binder (传递可序列化的数据)
  • SharedPreferences
    可靠性下降,不支持并发写,会出现脏数据。
  • Activity
    可以跨进程调用其他应用程序的Activity
    其实也就是传入Intent,setResult返回Intent
  • ContentProvider
  • BroadcastReceiver
  • Service
    Content Provider类似,也可以访问其他应用程序中的数据, 但不同的是,ContentProvider返回的是Cursor对象, 而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
  • Socket
    学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值