Android多进程模式

作者: 晴明_ | 来源:发表于2016-07-13 16:25 被阅读1875次

本文内容基于《Android开发艺术探索》,强烈推荐,值得一看。

在Android中说多进程一般是指一个应用中存在多个进程,在Android中使用多进程只有一种方法:给四大组件在AndroidMenifest中指定android:process属性,除此之外别无他法(通过JNI在native层去fork一个进程也可以,不常用,不做介绍),所以我们不能给一个线程或者实体类指定其运行时所在的进程。

1.开启多进程

<activity
    android:name="com.zhong.ActivityA" />
<activity
    android:name="com.zhong.ActivityB"
    android:process=":remote" />
<activity
    android:name="com.zhong.ActivityC"
    android:process="com.zhong.remote" />
1). 上面三个Activity中:
  • ActivityA:未指明android:process属性,它允许在默认进程中,进程名为包名,即com.zhong;
  • ActivityB:设置android:process=":remote",系统会为它创建一个单独的进程,进程名为包名+:remote,即com.zhong:remote,相当于android:process="com.zhong:remote";
  • ActivityC:设置android:process="com.zhong.remote",系统会为它创建一个单独的进程,进程名为process设置的值,即com.zhong.remote
2). ":remote"和"com.zhong.remote"区别

":remote"中":"是指要在当前进程名前面附近包名的简写,"com.zhong.remote"是一种完整的写法,进程名不会再附加包名;其次,":"是属于当前应用的私有进程,"com.zhong.remote"是全局进程,全局进程其他应用可以通过ShareUID方式跑在同一进程中(前提是两个应用ShareUID相同并且签名相同),这两个应用可以相互访问对方私有数据。

2.运行机制

由于Android为每个进程分配独立的虚拟机,所以不同虚拟机访问同一个类会产生不同的副本,因此运行在不同进程中的组件无法通过内存共享数据,所以一个应用使用多进程会出现一下几个问题:

  • 静态成员和单例模式完全失效(不是同一块内存,会产生不同的副本)
  • 线程同步机制完全失效(不是同一块内存,所以对象也不是同一个,因此类锁、对象锁也不是同一个,不能保证线程同步)
  • SharedPreferences 可靠性下降(SharedPreferences不支持多个进程同时写,会有一定的几率丢失数据)
  • Application 多次创建(Android为每个进程分配独立的虚拟机,这个过程其实就是启动一个应用,所以Application会被创建多次)

小结: Android中使用多进程一般是来分担主进程的内存压力,应用越做越大,需要的内存也越来越多,讲一些独立的组件放在不同的进程中,这样可以减轻主进程的内存负担;还有就是启动一个Service,做一些守护或者耗时的操作。
本来想写一下Binder机制的,但现在自己还没完全搞懂,以后补上下面几篇文章会写一下IPC方式:Messenger、AIDL、ContentProvider以及Binder连接池的使用,至于文件、Socket我感觉不适很常用就不再做说明了

本人技术有限,欢迎指正,谢谢!

相关文章

网友评论

  • 爆发小宇:我能在这里请教一下别的问题吗?我在做开发的时候发现,在虚拟机中看到,有两个相同的包名在进程中,怎么解释呢
    晴明_:不好意思,这条消息我刚看到,进程的唯一标示是PID,进程名不是,所以可能会有这种情况,刚刚看了一下ActivityManagerService类中startProcessLocked() 方法,会根据uid和processName查找ProcessRecord app,只有(app != null && app.pid > 0)不成立时才会创建新的进程,所以同一个应用不会创建多个进程名相同的进程,不同应用可以创建多个进程名相同的进程(即,uid不同processName相同的进程)

本文标题:Android多进程模式

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