Android保活系列之——双进程守护

本文为个人学习笔记分享,没有任何商业化行为,对其他文章的引用都会标记。如有侵权行为,请及时提醒更正!如需转载请表明出处
Android保活相关博客大纲
希望看了的小伙伴都关注一下。

Android保活系列之——双进程守护_第1张图片

近期跳槽到玩加电竞,加之英雄联盟云顶之弈排位模式的推出,导致个人精力有限没有时间和心情去写相关的博客。

问题1:什么是双进程守护?

在Context中提供了bindService的方法

    @Override
    public boolean bindService(Intent service, ServiceConnection conn,
            int flags) {
        return mBase.bindService(service, conn, flags);
    }

绑定服务是客户端--服务器接口中的服务器。组件和服务进行绑定后,可以发送请求、接收响应、执行进程间通信(IPC)。这里的服务器模型不同于网络C-S模型而是针对于Android应用不同的功能进行进程划分,例如提供视频播放的进程我们可以把它当做视频播放服务器,我们UI层属于客户端,客户端想要调用视频播放,需要用IPC方式通过bind服务的方式调用视频播放服务。(PS:如果大家对IPC不太熟悉可以参考我的其他文章Android跨进程通信技术的使用及原理)客户端可以通过调用bindService()绑定到服务。调用时,必须提供ServiceConnection的实现,后者会监控与服务的连接及销毁。
借助bindService的机制,我们可以在主进程创建时创建一个守护进程,并监听守护进程的连接及销毁,再守护进程bindService中绑定主进程,这样即使进程因为锁屏、内存等问题杀掉后,也会被守护进程拉起,这就是Android中双进程守护的概念。当然早在PC时期,网吧的计时系统就使用了双进程守护机制,防止被恶意杀掉。
实现方式就不写了,网络上一搜一堆,这里给出一篇文章
Android 双进程守护
写的中规中矩,如果不清楚如何实现可以看一下。

8.0适配

谷歌官方8.0变更

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            applicationContext.startForegroundService(new Intent(sApp, TraceServiceImpl.class));
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            applicationContext.startService(new Intent(sApp, TraceServiceImpl.class));
        }

当版本>8.0时,如果需要在后台启动服务需要调用startForegroundService。并且在serivce中onCreate方法必须在5秒内调用startForeground ,向通知栏发一个通知告知用户你的App正在后台运行,否则就会抛出异常

    @Override
    public void onCreate() {
        super.onCreate();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //这样写有bug,在有些手机上会报错。
            //需要一个真实的Notification且需要给Notification设置Chanel。
            startForeground(0x12345, new Notification());
        }
    }

8.0通知适配

其他的一些思维扩展

保活分两种:拉活、保活
拉活和保活是相辅相成的。在6.0版本以后的机型上,系统杀应用是按照进程组杀的,会直接导致双进程守护失效。那么因此就不使用双进程了么?
1.低版本双进程守护是依然亲测好使。
2.双进程守护可以和后面讲到的 账号同步、外部PUSH、JobScheduler
相结合,可以规避开系统杀进程组的问题。使双进程守护功能可以兼容高版本。

最后一些话

讲的有些笼统,我寻思的发Dome、写例子,但这样解决不了根本问题,只有懂得了思路,了解了什么是双进程守护,才能在开发中随机应变。只能说Android水太深,大家需要细心细心再细心。

你可能感兴趣的:(Android保活系列之——双进程守护)