保证Android后台不被杀死的几种方法
2016-01-27 17:03
246 查看
由于各种原因,在开发Android应用时会提出保证自己有一个后台一直运行的需求,如何保证后台始终运行,不被系统因为内存低杀死,不被任务管理器杀死,不被软件管家等软件杀死等等还是一个比较困难的问题。网上也有各种方案,笔者经过自己试验学习尝试总结了3中还可以的方式,记录如下。并不是绝对保证,不过确实提高了存活率不少。
方式一:service绑定通知栏成为前台服务
android中实现后台一般通过service方式,但系统本身会在内存低等情况下杀死service。通过将service绑定到notification,就成为了一个用户可见的前台服务,这样可以大大提高存活率。
具体实现方式为在service中创建一个notification,再调用void android.app.Service.startForeground(int id, Notification notification)方法运行在前台即可。
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。但是360等软件管家依然可以杀死。
方式二:AlarmManager不断启动service
该方式原理是通过定时警报来不断启动service,这样就算service被杀死,也能再启动。同时也可以监听网络切换、开锁屏等广播来启动service。
参考实现方式如下:
Intent intent =new Intent(mContext, MyService.class);
PendingIntent sender=PendingIntent
.getService(mContext, 0, intent, 0);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5*1000,sender);
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。但是360等软件管家依然可以杀死。另外还有不断启动的逻辑处理麻烦。
方式三:通过jni调用,在c层启动多进程
该方式主要通过底层启动另外一个进程来实现。笔者猜测系统和三方软件管家杀死应用进程是通过包名相关线程等来遍历关闭。因此在c语言里启动另一个进程可以躲过杀死的命运。
该方式思路是应用通过jni调用c,再c语言中启动一个进程fork()。
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。360等软件管家也不会清理。但是带来了jni交互,稍微有点麻烦。
以上3中方式都逃不过小米、魅族手机的任务栏清理,原因需要进一步学习。
方式一:service绑定通知栏成为前台服务
android中实现后台一般通过service方式,但系统本身会在内存低等情况下杀死service。通过将service绑定到notification,就成为了一个用户可见的前台服务,这样可以大大提高存活率。
具体实现方式为在service中创建一个notification,再调用void android.app.Service.startForeground(int id, Notification notification)方法运行在前台即可。
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。但是360等软件管家依然可以杀死。
方式二:AlarmManager不断启动service
该方式原理是通过定时警报来不断启动service,这样就算service被杀死,也能再启动。同时也可以监听网络切换、开锁屏等广播来启动service。
参考实现方式如下:
Intent intent =new Intent(mContext, MyService.class);
PendingIntent sender=PendingIntent
.getService(mContext, 0, intent, 0);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5*1000,sender);
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。但是360等软件管家依然可以杀死。另外还有不断启动的逻辑处理麻烦。
方式三:通过jni调用,在c层启动多进程
该方式主要通过底层启动另外一个进程来实现。笔者猜测系统和三方软件管家杀死应用进程是通过包名相关线程等来遍历关闭。因此在c语言里启动另一个进程可以躲过杀死的命运。
该方式思路是应用通过jni调用c,再c语言中启动一个进程fork()。
该方式基本可以保证在正常运行情况下,以及任务栏移除历史任务后(小米、魅族手机除外),service不被杀死。360等软件管家也不会清理。但是带来了jni交互,稍微有点麻烦。
以上3中方式都逃不过小米、魅族手机的任务栏清理,原因需要进一步学习。
相关文章推荐
- 安卓activity的启动模式
- Android Proguard apk防止破解
- 解决部分android手机照片被系统自动旋转90度
- 如何在低版本中适用Android 5.0设计Material风格
- Android几种数据传递方法汇总
- android-贪吃蛇开发
- Android百度地图定位后获取周边位置的实现代码
- 这些年正Android - 大纲
- Android Settings 声音设置
- 小白讲讲Nine-Patch
- Android 6.0 Marshmallow SettingsProvider
- 安卓图片下载
- 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
- Android 触摸事件分发
- APK瘦身实践
- Android Design Support控件介绍之TabLayout
- Android 仿IOS3D时间选择器城市选择器
- 从框架到完整项目搭建,实战项目《约个球》(7)- 将项目迁移到android studio,使用gradle搭建android项目(上)
- Android 使用ViewPager实现左右循环滑动图片和显示当前页码
- 获取wifi的ip地址