1、前台service:
启动一个前台service,这样该service所在的进程优先级会是0,也就是正在使用的前台进程,基本不会被杀死了。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtils.iTag(LOG_TAG , "KeepLiveService start !!!");
Notification.Builder builder = new Notification.Builder(getApplicationContext());
Intent shelfIntent = new Intent(this , BookshelfActivity.class);
builder.setContentIntent(PendingIntent.getActivity(this , 0 , shelfIntent , PendingIntent.FLAG_CANCEL_CURRENT))
.setLargeIcon(BitmapFactory.decodeResource(getResources() , R.mipmap.ic_launcher))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Reader is running")
.setContentText("dont clear this notification")
.setWhen(System.currentTimeMillis());
Notification notification = builder.build();
startForeground(KEEP_LIVE_NOTIFY_ID , notification);
return super.onStartCommand(intent, flags, startId);
}
具体做法就是在一个service的onStartCommand回调中,使用startForeground,它会在系统通知栏上放置一个notification,从而让该服务变成前台服务。
比较适合的例如音乐类软件。
2、接入各种推送。
各种推送sdk一般都会唤醒该手机接入了同样sdk的应用。像我们现在的手机,基本上就是打开一个应用,那么它连带着可能就唤醒了一大票应用,这也是为什么Android手机应用安装的越多,后期越卡的原因之一吧。
3、系统白名单。
这就是大厂应用的专属了,qq,微信等皆在此列。当然,他们也会有一些自己的保活手段,比如之前听说过的,在屏幕上保持一个1像素的界面,从而让自己始终处于前台。
最后,最简单靠谱的应该就是1和2了,其中关于前台服务,也看有人研究过可以想办法达到隐藏通知的效果。用两个服务分别启动一个相同id的前台服务,然后后把后一个服务杀死。但是这个方法应该是在Android7.1之后就被修复了,不可以启动两个相同notificationId的前台服务。
还有双进程守护,那应该是5.0之后就被修复了。