安卓内存管理策略是 进程退出并不会立刻杀死,而是在系统内存赤金的时候再来按照优先级杀掉进程。他给进程分别定义了6个阈值,作为杀死进程优先级。这6个分别是
ForegroundProgress/VisibleProgress/SecondaryService/HiddenProgress/ContentProvider/EmptyProgress
1、前台进程(比如正在显示的activity所在的进程)
2、可见进程(比如输入法进程)
3、次要服务进程
4、隐藏进程
5、内容提供者进程
6、空进程
具体api可以参考com.android.server.am.ActivityManager.RunningProgressInfo
通过这个可以采取应对措施 让应用被杀死的可能性降低
1、将Service设置为前台进程
设置成了前台服务,手机状态栏会有个无法消除的notification,这样用户体验很差
2、在service的onstart方法里返回 STATR_STICK
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
START_STICKY:系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
START_NOT_STICKY:直到接受到新的Intent对象,才会被重新创建。这是最安全的,用来避免在不需要的时候运行你的服务。
START_REDELIVER_INTENT:系统就会重新创建了这个服务,并且用最后的Intent对象调。等待中的Intent对象会依次被发送。这适用于如下载文件。
3、添加Manifest文件属性值为android:persistent=“true”
签名编译不过,然并软
4、覆写Service的onDestroy方法
这个 针对force close 是无效的
5、添加广播监听android.intent.action.USER_PRESENT事件以及其他一些可以允许的事件
这个广播是用户解锁发出的,可以静态注册的一个广播接收者
6、服务互相绑定
7、设置闹钟,定时唤醒
AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
8、账户同步,定时唤醒
9、native层保活
高版本还是行不通
10.JobScheduler
8.0还是会被杀死