实验了几种最后选择了2中组合
第一种
开启一像素activity保活,如果2个activity同时被杀死则此方案不可选。
第二种
发送null的notification 提高进程优先级像酷狗音乐的通知栏一样 强制推出还是被杀死
第三种
jobservice jobsheduler 的使用native来唤醒 该方案在强制杀死app进程之后会拉起新的app进程
最后选择 2,3来进行保活。
简单介绍jobservice
jobservice种有2个抽象方法 onstartjob(),onstopjob() 调用该service需要权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name=".MyJobService" android:enabled="true" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
onstopjob()在调用jobfinish()后调用。当杀死进程的时候会调用onstartjob()方法,这时我们 可以在logcat中看到日志。或者在onstartjob()中toast一些文字。但是不可以进行耗时操作。缺点耗电。
我的service(亲测可自行调起被杀死的app)
/**
* Created by sunxx on 2018/3/13.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("cvca","启动onStartCommand");
startJobSheduler();
return START_STICKY;
}
public void startJobSheduler() {
try {
JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()));
//这个方法只能保证在设置的这段时间内,任务最多执行一次
builder.setPeriodic(100);
//设备重启之后你的任务是否还要继续执行
builder.setPersisted(true);
JobScheduler jobScheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
public boolean onStartJob(JobParameters params) {
boolean isLocalServiceWork = isServiceWork(this, "com.mapbar.test.savelife.TestServce");
if (isLocalServiceWork){
Log.i("cvca","on");
}else{
Log.i("cvca","off");
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.aa.test.savelife");
startActivity(LaunchIntent);
}
Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show();
if (isLocalServiceWork){
Log.i("cvca","on");
}else{
Log.i("cvca","off");
}
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.i("cvca","onStopJob检测");
return true;
}
// 判断服务是否正在运行
public boolean isServiceWork(Context mContext, String serviceName) {
boolean isWork = false;
ActivityManager myAM = (ActivityManager) mContext
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(100);
if (myList.size() <= 0) {
return false;
}
for (int i = 0; i < myList.size(); i++) {
String mName = myList.get(i).service.getClassName().toString();
if (mName.equals(serviceName)) {
isWork = true;
break;
}
}
return isWork;
}
}
详细内容请看http://blog.youkuaiyun.com/u013263323/article/details/56285475
需要demo请留下邮箱