溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android5.0以上app進(jìn)程保活的正確姿勢(shì)

發(fā)布時(shí)間:2020-07-31 18:44:18 來源:網(wǎng)絡(luò) 閱讀:1297 作者:brycegao 欄目:移動(dòng)開發(fā)

    我的原文: http://blog.csdn.net/brycegao321/article/details/52312030      

    有圖有真相,  親測(cè)錘子T2、華為Mate8手機(jī)殺掉進(jìn)程后能自啟, 我設(shè)置的自啟時(shí)間間隔為500ms(僅僅是為了測(cè)試)。                                          

                   Android5.0以上app進(jìn)程保活的正確姿勢(shì)    Android5.0以上app進(jìn)程?;畹恼_姿勢(shì)

 

           首先要明確?;畹母拍睿?/span>

           1、非android核心進(jìn)程(例如com.android.phone)都可以被干掉;

       2、保活并不能真正的保證app進(jìn)程不死,  而是能在被干掉后馬上啟動(dòng);


Android系統(tǒng)按照進(jìn)程的優(yōu)先級(jí)分為:

1. 前臺(tái)進(jìn)程(Forgroud process):   頂層activity(已執(zhí)行onResume); 有個(gè)Service,并綁定到跟用戶正在交互的activity;在Service里調(diào)用了startForground函數(shù);正在執(zhí)行 onReceive函數(shù)的BroadCastReceiver。

2. 可見進(jìn)程(Visible process):   被對(duì)話框遮擋的activity, 執(zhí)行了onPause;    擁有綁定到Activity的Service, 但該Activity被遮擋了,  例如按Home鍵,并執(zhí)行了onStop。
3. 服務(wù)進(jìn)程(Service process): 有正在運(yùn)行的Service, 但是沒有1/2的特性。

4. 后臺(tái)進(jìn)程(Background process)沒有正在運(yùn)行的Service, 只有不可見的Activity,  即Activity執(zhí)行了onStop函數(shù)。

5. 空進(jìn)程(Empty Process), 不含Android 4大組件的進(jìn)程。


        按照Android的設(shè)計(jì),  app只能提高自己的進(jìn)程優(yōu)先級(jí),  降低被殺掉的概率。

 

       我們更關(guān)心的是進(jìn)程被干掉后怎么拉起來,  有如下幾個(gè)方法:

 1、 注冊(cè)靜態(tài)BroadcastReceiver,  監(jiān)聽系統(tǒng)廣播;

 2、 啟動(dòng)一個(gè)服務(wù), 并覆蓋Service的onStartCommand函數(shù), 返回Service.START_STICKY。    用處是被gc回收后在以后某個(gè)時(shí)間被系統(tǒng)拉起來, 然并卵,    并不是我們想要的。

 3.   使用Native進(jìn)程?;睿?nbsp; Android5.0以下好用, 在Android5.0以上就廢了, 所以不細(xì)說了。

 4.  使用JobSheduler機(jī)制?;睿?nbsp;  上帝在關(guān)閉一扇門的時(shí)候(native進(jìn)程?;顝U棄了),打開了一扇窗(JobSheduler替代了native進(jìn)程方式)。

 5.   家族系app互拉, 例如百度旗下所有app, 啟動(dòng)其中一個(gè)app時(shí), 它會(huì)拉起百度旗下其他app進(jìn)程。作法很流氓,  也是廠商和用戶深惡痛絕的。


以下是參考代碼, 只是為驗(yàn)證進(jìn)程能自啟, 所以寫的很簡(jiǎn)單Android5.0以上app進(jìn)程?;畹恼_姿勢(shì)

public class MyJobService extends JobService {    @Override    public void onCreate() {        super.onCreate();        startJobSheduler();    }    public void startJobSheduler() {        try {            int id = 1;            JobInfo.Builder builder = new JobInfo.Builder(id,                    new ComponentName(getPackageName(), MyJobService.class.getName() ));            builder.setPeriodic(500);  //間隔500毫秒調(diào)用onStartJob函數(shù), 500只是為了驗(yàn)證            JobScheduler jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE);            int ret = jobScheduler.schedule(builder.build());        } catch (Exception ex) {
            ex.printStackTrace();        }
    }    @Override    public boolean onStartJob(JobParameters jobParameters) {
        Log.d("brycegao", "onStartJob alive");        return false;    }    @Override    public boolean onStopJob(JobParameters jobParameters) {
        Log.d("brycegao", "onStopJob alive");        return false;    }
}
<service android:name=".MyJobService"    android:permission="android.permission.BIND_JOB_SERVICE"/>




                               我的微信公眾號(hào), 歡迎關(guān)注, 讓我們一起成長Android5.0以上app進(jìn)程?;畹恼_姿勢(shì)

                                                     Android5.0以上app進(jìn)程?;畹恼_姿勢(shì)       


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI