Android创建多进程

为何要使用多进程

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")
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程...
    酱拌饭阅读 801评论 0 5
  • 进程介绍 先强化两个进程相关的概念 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作...
    a程序之路阅读 3,551评论 0 3
  • 今天,了解到Android多进程不仅仅是针对于AIDL,而像Application,Acitvity,Servic...
    星空下奔跑阅读 365评论 0 0
  • 前言 其实很久之前就又知道多进程这种方式,因为在我理解中OOM的最终解决方案就是使用此种方式,再加上之前就了解到插...
    清明捉鬼阅读 255评论 0 1
  • 正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用...
    PeytonWu阅读 4,244评论 0 2