有很多APP和需求,需要让APP不被系统杀死。
然而,我在这里,必须明确的跟各位安卓开发者说的就是,这个需求就跟让物理学家发明永动机一样,是不可行的。
然而,我们却可以尽最大的可能性让APP存活下来。实现最大存活有多种方式,网上的各位大牛,也有列出方法,我也想在这里,系统的总结一下。
但暂时没能一下就全列出来,后面,想到哪个就再补上来,或者如果您有好的建议,直接在评论处给个建议,我会将您的建议列入。
针对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"/>接入极光、友盟等第三方SDK。
这些第三方SDK,普遍有“互拉”的功能。特别是友盟,居然连UC都有。UC现在,普及程度不比微信低多少。接入这些第三方SDK的优点是,实现互拉,可以大大的增加APP存活机率,哪怕APP被killed了,也能被拉起来。
但是,弊端也有。就是有些Android系统,已经出现了禁止互拉功能的选项了,不过,用户一般不会去操作吧。开一个后台服务,通过设置android:process属性,来让这个后台与APP处于不同进程,来达到互相监听,互相唤醒。
然而实际情况呢?优点是,在部分机子上,确实可以。。但部分机子上,当APP被杀后,这些“处于不同进程的服务“也照样被杀。据说,有些机子杀APP是直接把APP相关的进程池都清空掉。所以,这种方法,不一定行得通。开一个后台服务,通过设置android:process属性,来让这个后台与APP处于不同进程,来达到互相监听,互相唤醒。然而实际情况呢?
优点是,在部分机子上,确实可以。。但部分机子上,当APP被杀后,这些“处于不同进程的服务“也照样被杀。
据说,有些机子杀APP是直接把APP相关的进程池都清空掉。所以,这种方法,不一定行得通。还有一种!杀不死服务实现原理:
- Android一个app可以启动2个进程 2:进程A与进程B互相守护 3:进程A时刻盯着进程B,通用进程B也时刻盯着进程B
- 进程之间互相盯着,需要用到IPC进程间通信技术(也就是Binder机制AIDL
- 注意配置远程服务启动为一个新的进程,为新进程命名为 android:process=”.remoteService”
- 进程A服务绑定进程B服务,进程B服务绑定进程A服务!!!!