Android 系統(274)---Anroid5.0以上程序保活方案(親測可自行調起被殺死的app)
Anroid5.0以上程序保活方案(親測可自行調起被殺死的app)
實驗了幾種最後選擇了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.csdn.net/u013263323/article/details/56285475