Android后台进程保活方案

作者: Cui三土 | 来源:发表于2017-11-24 09:53 被阅读0次

一、Native方案

1、利用Native进程拉活

2.1 方案设计思想

思想:使用 Linux 中的 fork 机制创建 Native 进程,在 Native 进程中监控主进程的存活,当主进程挂掉后,在 Native 进程中立即对主进程进行拉活。

原理:在 Android 中所有进程和系统组件的生命周期受 ActivityManagerService 的统一管理。Android5.0以下通过 Linux 的 fork 机制创建的进程为纯 Linux 进程,其生命周期不受 Android 的管理。

2.2 方案适用范围

该方案主要适用于 Android5.0 以下版本手机。

该方案不受 forceclose 影响,被强制停止的应用依然可以被拉活,在 Android5.0 以下版本拉活效果非常好。
详情

对于 Android5.0 以上手机,系统虽然会将native进程内的所有进程都杀死,这里其实就是系统“依次”杀死进程时间与拉活逻辑执行时间赛跑的问题,如果可以跑的比系统逻辑快,依然可以有效拉起。在 某些 Android 5.0 以上机型有效。
详情

2.3 关联项目

https://github.com/Marswin/MarsDaemon

作者5.0以下系统用一个java进程和一个fork出来的纯native进程双管道互锁监听对方的状态,无论哪个被杀后都拉起第三个进程,第三个进程来拉活常驻进程,实现拉活。
5.0以上同一进程组的进程会被同时杀死,所以5.0以上使用双java进程在native层互锁文件实现监听,但任务管理器会在短时间内杀死所有进程,只能用反射提前初始化pacel,在进程被杀的时候和系统抢那几十毫秒的时间发送一个拉活的广播。用4个文件来让两个进程实现互锁来做监听,但实际效果很一般,测试了几个5.0以上的国产机型都不行,效果是根本监听不到进程被杀,目测原因是当任务管理器查杀进程的时候将所有的进程都挂起了,随后全部杀掉,并在一段时间内禁止进程启动。

二、原生方法

1、使用JobService保活

PersistedJobService.java

<service
    android:name=".service.PersistedJobService"
    android:permission="android.permission.BIND_JOB_SERVICE"
/>

2、自启动权限

BootReceiver.java静态注册BroadcastReceiver

Intent sevice = new Intent(context, BackgroundService.class);
context.startService(sevice);

注册,开机,网络切换、拍照、拍视频时候,利用系统产生的广播也能唤醒app,不过Android N已经将这三种广播取消了

<receiver android:name=".recevier.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.intent.action.PACKAGE_RESTARTED" />
        <action android:name="com.xianzhi.boot" />
    </intent-filter>
</receiver>

常用的拉活权限


image.png
<uses-permission android:name="android.intent.action.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

3、后台Service

BackgroundService.java
WakeLock

protected PowerManager.WakeLock mWakeLock;
mWakeLock = ((PowerManager) getSystemService(Context.POWER_SERVICE))
                .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.acquire();

作为前台应用运行,提高应用存活几率

PendingIntent pendingintent = PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Notification.Builder builder = new Notification.Builder(this)
            .setAutoCancel(true)
            .setLargeIcon(bitmap)
            .setContentTitle("**软件")
            .setContentText("后台运行中")
            .setContentIntent(pendingintent)
            .setSmallIcon(android.R.drawable.ic_notification_overlay)
            .setWhen(System.currentTimeMillis())
            .setOngoing(true);
Notification notification=builder.getNotification();
startForeground(NOTIFICATION_FORGROUND_FLAG,notification);//前台保活

service被关掉后自动启动

START_STICKY
如果系统在onStartCommand返回后被销毁,系统将会重新创建服务并依次调用onCreate和onStartCommand(注意:根据测试Android2.3.3以下版本只会调用onCreate根本不会调用onStartCommand,Android4.0可以办到),这种相当于服务又重新启动恢复到之前的状态了)。

START_NOT_STICKY
如果系统在onStartCommand返回后被销毁,如果返回该值,则在执行完onStartCommand方法后如果Service被杀掉系统将不会重启该服务。

START_REDELIVER_INTENT
START_STICKY的兼容版本,不同的是其不保证服务被杀后一定能重启。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    ....
    return START_STICKY;
}

service注册,权限设置为高优先级

<service
    android:name=".service.BackgroundService"
    android:enabled="true">
    <intent-filter android:priority="1000">
        <action android:name="com.xianzhi.androidkeepalive" />
    </intent-filter>
</service>

4、保护进程

KeepAliveService.java
注册,在新的独立进程内启动,适用5.0以下的原生系统,5.0以上同样会被杀死

<service 
    android:name=".service.KeepAliveService"
    android:process=":keep"
/>

5、账号同步唤醒APP

他的局限性在于:
第一,用户会在系统设置的账户列表里面看到一个不认识的账户;
第二,同步的事件间隔是有限制的,最短1分钟,见源码,如果小雨60秒,置为60秒。而且各种国产机怎么改的源码我们未可知,是不是都能用仍然未可知;
第三,很致命,某些手机比如note3需要手动设置账户,你如何骗你的用户给你手动设置账户完了之后不卸载你;
第四,也很致命,必须联网!google提供这个组件是让你同步账户信息,不联网你同步个鬼,我们要保活,可以不联网不做事,但是不能不联网就死

三、应用项目唤醒

集成三方推送平台sdk,友盟极光等

相关文章

  • Android后台进程保活方案

    一、Native方案 1、利用Native进程拉活 2.1 方案设计思想 思想:使用 Linux 中的 fork ...

  • 第十六周 进程保活

    话题:进程保活 这个问题时常在面试中被问到关键字:Android 进程保活招式大全 参考答案 1.进程保活方案 -...

  • Android 后台运行白名单,优雅实现保活

    Android 后台运行白名单,优雅实现保活 保活现状 我们知道,Android 系统会存在杀后台进程的情况,并且...

  • Android进程保活实践总结

    Android进程保活

  • Android进程保活方案

    目的 进程保活是各个公司想要实现的一个功能,可以“无赖”地一直霸占你的手机,不被系统和第三方杀掉,以下是几种方案,...

  • Android 进程保活方案

    Android 系统为了保持系统运行流畅,在内存吃紧的情况下,会将一些进程 kill ,以释放一部分内存。然而,对...

  • Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,...

  • Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,...

  • Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,...

  • 关于 Android 进程保活

    关于 Android 进程保活 Android进程保活手段主要分3种: 1:利用不同的app进程使用广播来进...

网友评论

    本文标题:Android后台进程保活方案

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