1. 程式人生 > >Android 系統(274)---Anroid5.0以上程序保活方案(親測可自行調起被殺死的app)

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