有很多APP和需求,需要让APP不被系统杀死。
然而,我在这里,必须明确的跟各位安卓开发者说的就是,这个需求就跟让物理学家发明永动机一样,是不可行的。
然而,我们却可以尽最大的可能性让APP存活下来。实现最大存活有多种方式,网上的各位大牛,也有列出方法,我也想在这里,系统的总结一下。
但暂时没能一下就全列出来,后面,想到哪个就再补上来,或者如果您有好的建议,直接在评论处给个建议,我会将您的建议列入。

  1. 针对6.0+系统,忽略电池优化功能。优点是锁屏后,还能让APP一直运行。缺点是,用户可能不同意。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /** * 忽略电池优化 */
    public void ignoreBatteryOptimization(Activity activity) {
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(activity.getPackageName());
    // 判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。
    if(!hasIgnored) {
    Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:"+activity.getPackageName()));
    startActivity(intent);
    }
    }
    // 在AndroidManifest.xml里加入以下权限。android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
  2. 接入极光、友盟等第三方SDK。
    这些第三方SDK,普遍有“互拉”的功能。特别是友盟,居然连UC都有。UC现在,普及程度不比微信低多少。接入这些第三方SDK的优点是,实现互拉,可以大大的增加APP存活机率,哪怕APP被killed了,也能被拉起来。
    但是,弊端也有。就是有些Android系统,已经出现了禁止互拉功能的选项了,不过,用户一般不会去操作吧。

  3. 开一个后台服务,通过设置android:process属性,来让这个后台与APP处于不同进程,来达到互相监听,互相唤醒。
    然而实际情况呢?优点是,在部分机子上,确实可以。。但部分机子上,当APP被杀后,这些“处于不同进程的服务“也照样被杀。据说,有些机子杀APP是直接把APP相关的进程池都清空掉。所以,这种方法,不一定行得通。

  4. 开一个后台服务,通过设置android:process属性,来让这个后台与APP处于不同进程,来达到互相监听,互相唤醒。然而实际情况呢?
    优点是,在部分机子上,确实可以。。但部分机子上,当APP被杀后,这些“处于不同进程的服务“也照样被杀。
    据说,有些机子杀APP是直接把APP相关的进程池都清空掉。所以,这种方法,不一定行得通。

  5. 还有一种!杀不死服务实现原理:

  • Android一个app可以启动2个进程 2:进程A与进程B互相守护 3:进程A时刻盯着进程B,通用进程B也时刻盯着进程B
  • 进程之间互相盯着,需要用到IPC进程间通信技术(也就是Binder机制AIDL
  • 注意配置远程服务启动为一个新的进程,为新进程命名为 android:process=”.remoteService”
  • 进程A服务绑定进程B服务,进程B服务绑定进程A服务!!!!