Android--使用JobService實現進程保活

來源:互聯網
上載者:User

標籤:ons   local   jobs   sys   二次   start   span   html   for   

進程保活一直是廣大APP開發人員所希望的,因為進程活著我們就可以操作很多事情(推送,資料同步等等),但是google大大是不允許這樣做的(最佳化),所以我們要另闢蹊徑。

  1. 先來看看android中有幾種進程吧。
    • 前台進程:Foreground process
      • 使用者正在互動的Activity(onResume())
      • 當某個Service綁定正在互動的Activity。
      • 被主動調用為前台Service(startForeground())
      • 組件正在執行生命週期的回調(onCreate()/onStart()/onDestroy())
      • BroadcastReceiver 正在執行onReceive();

    • 可見進程:Visible process
      • 我們的Activity處在onPause()(沒有進入onStop())
      • 綁定到前台Activity的Service。
    • 服務進程:Service process
      • 簡單的startService()啟動。
    • 後台進程:Background process
      • 對使用者沒有直接影響的進程----Activity出於onStop()的時候。
        android:process=":xxx"

    • 空進程:Empty process
      • 不含有任何的活動的組件。(android設計的,為了第二次啟動更快,採取的一個權衡)

  2、通常我們啟動的都是一個服務進程,要麼直接 startService() 要麼 bindService(),我們可能需要在這些服務進程裡面做一些事情,但這些事情並不是說我們現在要做的,可能是將來要做的,或者是在某個時間條件下要做的,這時候我們就需要我們的service保持活動狀態。

  3、JobService 可以算是一個 JobScheduler 的回調服務。JobScheduler是一個系統級的作業調度器,我們將某些任務扔給系統,當達到我們設定的條件以後,JobScheduler再吊起我們的JobService執行我們的商務邏輯。

    • 這裡主要是介紹如何利用JobScheduler進行我們的服務保活,JobScheduler就不介紹了,有需要瞭解請移駕官方文檔。
    • https://developer.android.google.cn/reference/android/app/job/JobScheduler.html

  4、接下來看看我們如何?。(我就直接上代碼了)

    • @SuppressLint("NewApi")public class JobHandleService extends JobService {    private int kJobId = 0;    @Override    public void onCreate() {        super.onCreate();        Log.i("INFO", "jobService create");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i("INFO", "jobService start");        // 在服務啟動時,直接將任務推到JobScheduler 的任務隊列,然後在設定的時間條件到達時,便會直接吊起我們的服務,走onStartJob()方法        scheduleJob(getJobInfo());        return START_NOT_STICKY;    }    @Override    public void onDestroy() {        super.onDestroy();    }    @Override    public boolean onStartJob(JobParameters params) {//        params.getExtras()//        scheduleJob(getJobInfo());        boolean isLocalServiceWork = isServiceWork(this, "com.xxx.XxxService");        boolean isRemoteServiceWork = isServiceWork(this, "com.xxx.XxxService");        if (!isLocalServiceWork || !isRemoteServiceWork) {            this.startService(new Intent(this, LocalService.class));            this.startService(new Intent(this, RemoteService.class));            Toast.makeText(this, "process start", Toast.LENGTH_SHORT).show();        }        return true;    }    @Override    public boolean onStopJob(JobParameters params) {        Log.i("INFO", "job stop");        // 當執行完畢時,我們再將任務加入到 JobScheduler 裡面就可以了。        scheduleJob(getJobInfo());        return true;    }    /**     * Send job to the JobScheduler.     */    public void scheduleJob(JobInfo t) {        Log.i("INFO", "Scheduling job");        JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);        if (tm != null) {            tm.schedule(t);        }    }    public JobInfo getJobInfo() {        JobInfo.Builder builder = new JobInfo.Builder(kJobId++, new ComponentName(this, JobHandleService.class));        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);        builder.setPersisted(true);        builder.setRequiresCharging(false);        builder.setRequiresDeviceIdle(false);        builder.setPeriodic(10);//間隔時間--周期        return builder.build();    }    /**     * 判斷某個服務是否正在啟動並執行方法     *     * @param mContext     * @param serviceName 是包名+服務的類名(例如:net.loonggg.testbackstage.TestService)     * @return true代表正在運行,false代表格服務沒有正在運行     */    public boolean isServiceWork(Context mContext, String serviceName) {        boolean isWork = false;        ActivityManager myAM = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);        List<RunningServiceInfo> myList = null;        if (myAM != null) {            myList = myAM.getRunningServices(100);        }        if (myList != null && myList.size() <= 0) {            return false;        }        if (myList != null) {            for (int i = 0; i < myList.size(); i++) {                String mName = myList.get(i).service.getClassName();                if (mName.equals(serviceName)) {                    isWork = true;                    break;                }            }        }        return isWork;    }}

       

我這裡就是簡單的示範一下,具體我們項目裡面的實現並沒有發到上面,各位可以自己琢磨。

Android--使用JobService實現進程保活

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.