前兩篇文章講的是怎麼保護進程不被殺,今天來講說進程被殺後該怎麼拉活。android
在系統安全管家清理內存的時候,第三方應用很容易被幹掉。若是不想被殺怎麼辦?最有效的解決辦法是:誘導用戶把你的應用加入白名單。可是不是全部用戶都會乖乖聽你的話。這就須要咱們採起其餘手段,千方百計再次把進程啓動。面試
今天介紹兩種經常使用的方法,可讓進程被殺後還有復活的但願。安全
說到定時器,咱們最早想到的確定是 AlarmManager,利用它能夠完成定時任務。具體用法我在這裏就不細說了,只講講在進程拉活的時候怎麼用。在 Service 啓動的時候,咱們開啓一個定時任務:每十分鐘檢查一次 Service 是否存活,若是未在運行,就啓動該 Service。性能優化
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(getApplication(), DaemonService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 1024, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pendingIntent);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10 * 60 * 1000, pendingIntent);
複製代碼
可是 AlarmManager 有個硬傷,在系統 force stop 某進程的時候,會清除該進程註冊的鬧鐘事件。這樣,定時器就沒法完成定時任務,咱們的目的達不到了。bash
好在天無絕人之路!Android 5.0 及以上版本提供了 JobScheduler 的 API,它和 AlarmManager 相似,都是爲了完成定時任務。可是 JobScheduler 的觸發條件比較靈活,好比網絡鏈接時、充電時、空閒時。最關鍵的一點是它無視 force stop,被系統強行殺死的進程依然能在某一時間完成定時任務,這就給咱們提供了無限可能!網絡
首先開啓 JobScheduler 定時任務,它須要指定一個完成定時任務的 JobService,觸發條件設置爲網絡鏈接、週期爲十分鐘,順便設置重啓後繼續生效 JobScheduler 任務。架構
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.cancelAll();JobInfo.Builder builder = new JobInfo.Builder(1024, new ComponentName(getPackageName(), ScheduleService.class.getName()));
builder.setPeriodic(10 * 60 * 1000);
builder.setPersisted(true);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
int schedule = jobScheduler.schedule(builder.build());
if (schedule <= 0) {
Log.w(TAG, "schedule error!");
}
複製代碼
咱們在 ScheduleService 裏啓動要拉活的進程,而後告訴 JobScheduler 咱們幹完活了。ide
public class ScheduleService extends JobService {
private static final String TAG = "ScheduleService";
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "onStartJob(): params = [" + params + "]");
Intent intent = new Intent(this, DaemonService.class);
startService(intent);
jobFinished(params, false);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "onStopJob(): params = [" + params + "]");
return false;
}
}
複製代碼
註冊 manifest 時,須要聲明一下權限。性能
<service
android:name="com.silence.keeplive.timer.ScheduleService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
複製代碼
在發生特定系統事件時,系統會發出響應的廣播,經過在 AndroidManifest 中靜態註冊對應的廣播監聽器,便可在發生響應事件時拉活。可是對於國內各類定製的 ROM 來講,此方案的效果並很差,由於安全管家會管理開機和後臺自啓,攔截髮送給第三方應用的廣播,因此該方案只能做爲備選方案。學習
除了上面列出的,還有
電源鏈接或斷開:ACTION_POWER_CONNECTED、ACTION_POWER_DISCONNECTED
在測試過程當中發現,進程在被 force stop 後,一段時間內是收不到廣播的,該方案的侷限性太大,收效甚微。
在如今這個金三銀四的面試季,我本身在網上也蒐集了不少資料作成了文檔和架構視頻資料免費分享給你們【包括高級UI、性能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料】,但願能幫助到您面試前的複習且找到一個好的工做,也節省你們在網上搜索資料的時間來學習。