之前我们了解了 :
-----------------------------------Java——多线程浅析.
-----------------------------------Android——Handler详解
-----------------------------------Android——HandlerThread浅析
-----------------------------------Java——ThreadPool线程池
让我们继续看看Android多进程:
1. 概述
默认情况下,同一应用的所有组件均在相同的进程中运行,且大多数应用都不应改变这一点。但是,如果您发现需要控制某个组件所属的进程,则可在清单文件(AndroidMenifest)中执行此操作。
主要依靠android:process属性:
各类组件元素activity、service、receiver和 provider的清单文件条目均支持 android:process 属性,此属性可指定该组件应在哪个进程中运行。
可以设置android:process属性,使每个组件均在各自的进程中运行,或者使某些组件共享一个进程,而其他组件则不共享
也可设置 android:process,以便不同应用的组件在同一进程中运行,但前提是这些应用共享相同的 Linux 用户 ID 并使用相同的证书进行签署。
此外,application 元素还支持 android:process 属性,用来设置适用于所有组件的默认值。
application类继承自 ContextWarpper 类,代表应用程序(即 Android App)的类,也属于Android中的一个系统组件
每个Android App运行时,会首先自动创建Application 类并实例化 Application 对象,且只有一个。即 Application类 是单例模式(singleton)类
也可通过 继承 Application 类自定义Application 类和实例
即不同的组件(如Activity、Service)都可获得Application对象且都是同一个对象
Application 对象的生命周期是整个程序中最长的,即等于Android App的生命周期
当内存不足,而其他更急于为用户提供服务的进程又需要内存时,Android 可能会决定在某一时刻关闭某个进程。正因如此,系统会销毁在被终止进程中运行的应用组件。当这些组件需再次运行时,系统将为其重启进程。
2. 开启多进程模式
正常情况下,在android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程只有一种方法,就是在AndroidMenifest中指定android:process属性。如下所示:
android:process=":remote"/>
android:process="com.zchhh.LaunchMode:remote"/>
其中FirstActivity和SecondActivity分别指定了process属性,并且它们的属性值不同,这意味着当前又增加了两个新进程。
假设当前包名为com.zchhh.LaunchMode,当FirstActivity启动时,系统会为它单独创建一个进程,进程名为"com.zchhh.LaunchMode:remote";
当SecondActivity启动时,系统也会为它单独创建一个进程,进程名com.zchhh.LaunchMode.remote。
我们注意到FirstActivity和SecondActivity的android:process属性分别为:remote和com.zchhh.LaunchMode.remote,它们有什么区别呢?
首先:
:指要在当前进程名前面加上包名,这是一种简写方法
对于FirstActivity来说它完整的进程名为com.zchhh.LaunchMode:remote
对于SecondActivity中的声明方式,是一种完整的声明方式,不会附加包名
其次: 私有进程和全局进程
进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程当中
不以“:”开头的进程属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中
Android会为每个应用分配唯一的一个UID,具有相同UID的应用才能共享数据。
【注】:
(1)私有进程:android:process=":remote",以冒号开头,冒号后面的字符串原则上是可以随意指定的。如果我们的包名为“com.biyou.multiprocess”,则实际的进程名 为“com.biyou.multiprocess:remote”。这种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
(2)全局进程:进程名称不以“:”开头的进程都可以叫全局进程,如android:process=“com.secondProcess”,以小写字母开头,表示运行在一个以这个