方案对比
方案名称 | 方案简述 | 优点 | 缺点 | 适用情况 |
---|---|---|---|---|
1像素保活 | 在屏幕关闭时打开一个1px的activity,屏幕亮时关闭此activity | 易于实现 | 锁屏时才能提高优先级,不稳定 | 适用于搭配其他方案一起使用 |
前台服务保活 | 启动一个前台服务,提高应用的优先级 | 系统机制 | 增加冗余服务 | 适用于常用保活 |
广播拉活 | 在接收到特定广播时拉起应用 | 易于实现 | 小厂使用,不够稳定 | 可作为辅助方案 |
sticky拉活 | 利用service的粘性来拉起应用 | 系统唤醒,方式文明 | 应用被杀死4-5次后系统不再拉起应用 | 此方式效果不明显,不推荐 |
账户同步拉活 | 利用账户同步机制拉活 | 系统唤醒,比较稳定 | 时间不能把控 | 适用于间隔性拉活需求,应用不需要持续存在 |
JobScheduler拉活 | 定时任务拉起应用 | 保活稳定 | 非常消耗性能 | 适用于流氓应用 |
双进程保活 | 两个进程相互拉起来保活 | 稳定 | 增加系统开销 | 适用于常用保活 |
注:需要注意的是上述保活指的是仅能提高进程优先级,系统不会自动杀死,但是如果用户主动杀死,应用便死了,拉活指的是被用户杀死仍然可以再拉起来,在低版本和部分厂商机型上适用,但在部分厂商和高版本安卓系统中,清理时会全部杀死,除非加入系统白名单,但上述方式仍可以使用来提高进程优先级,使系统自动清理时不杀死我们的应用
代码
github地址:https://github.com/dingjiaxing/KeepAliveDemo/
方案详细说明
1像素保活
- 描述
在屏幕关闭时打开一个1px的activity,屏幕亮时关闭此activity,因为在屏幕关闭时activity处于前台,所以系统将会把我们应用的优先级提高,从而遇到内存达到阈值时便不会杀死我们应用 - 关键代码
//1像素的activity,主题设为透明
public class OnePixelActivity extends Activity{
private static final String TAG = "OnePixelActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window=getWindow();
window.setGravity(Gravity.START|Gravity.TOP);
WindowManager.LayoutParams params=window.getAttributes();
params.width = 1;
params.height = 1;
params.x = 0;
params.y = 0;
window.setAttributes(params);
KeepManager.getInstance().setOnePixelActivity(this);
}
}
//广播接受者,接受广播
public class OnePixelKeepReceiver extends BroadcastReceiver {
private static final String TAG = "OnePixelKeepReceive