Android创建多进程

作者: 奔跑吧李博 | 来源:发表于2021-04-27 12:14 被阅读0次
    为何要使用多进程

    1.分散内存的占用
    我们知道Android系统对每个应用进程的内存占用是有限制的,而且占用内存越大的进程,通常被系统杀死的可能性越大。让一个组件运行在单独的进程中,可以减少主进程所占用的内存,避免OOM问题,降低被系统杀死的概率。
    2.子进程和主进程崩溃互不影响
    我们在子进程长时间运行,比如音乐,推送等,如果子进程崩溃了,不会影响主进程。反之主进程崩溃了,不会影响子进程的功能使用。
    3.实现守护进程
    如果主线程中的服务要从开机起持续运行,若由于内存等原因被系统kill掉,守护进程可以重新启动主线程的服务。
    通过JNI利用C/C++,调用fork()方法来生成子进程,一般开发者会利用这种方法来做一些daemon(守护进程)进程,来实现防杀保活等效果。

    使用多进程:

    在开发中,我们通常会使用修改清单文件的android:process来达到多进程的目的。activity、service、receiver 和 provider均支持android:process属性,此属性可以指定该组件应在哪个进程运行。如果android:process的value值以冒号开头的话,那么该进程就是私有进程,如果是以其他字符开头,那么就是公有进程,拥有相同 ShareUID 的不同应用可以跑在同一进程里。

    私有进程和公有进程

    私有进程:
    android:process=":remote",以冒号开头,冒号后面的字符串原则上是可以随意指定的,种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。

    公有进程:
    进程名称不以“:”开头、android:process值一定要有个点号的进程都可以叫全局进程,如android:process="com.secondProcess",以小写字母开头,表示运行在一个以这个名字命名的全局进程中,其他应用通过设置相同的ShareUID可以和它跑在同一个进程。

    示例:

    创建Application:

    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
    
            var pid = android.os.Process.myPid()
            Log.d("TAG", "app pid = $pid")
        }
    }
    

    创建一个service:

    class ProcessService : Service() {
    
        override fun onCreate() {
            super.onCreate()
    
            Log.d("TAG", "ProcessService onCreate")
        }
    
        override fun onBind(intent: Intent?): IBinder? {
            return null
        }
    }
    

    注册ProcessService并声明为一个独立进程

            <service android:name=".ProcessService"
                android:process="com.processService"/>
    

    在MainActivity启动ProcessService进程

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            Log.d("TAG", "MainActivity onCreate")
    
            startService(Intent(this, ProcessService::class.java))
        }
    }
    

    执行结果:


    在不同的进程中各自执行了MainActivity和ProcessService的onCreate方法,并且执行了2次Application的onCreate方法,执行在不同的进程中。

    指定启动了新进程,系统也会新建一个独立的虚拟机,自然需要重新初始化一遍Application。而我们会在Application的onCreate方法中做一些全局的初始化操作,它被初始化多次是完全没有必要的。就需要解决Application重复初始化的问题。

    解决方案:

    判断是否为主进程,只有主进程的时候才执行下面的操作,而且主进程的pid为项目的包名,以此为依据判断是否为主进程。

    MyApplication初始化加入进程判断:

    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
    
            //多个Application创建的问题:
            //避免重复初始化
    
            var processName = getProcessName()
            if (!TextUtils.isEmpty(processName) && processName.equals(packageName)) {
    
                //执行初始化
                var pid = android.os.Process.myPid()
                Log.d("TAG", "app pid = $pid")
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Android创建多进程

        本文链接:https://www.haomeiwen.com/subject/wpoyrltx.html