android六種方法保證service不被殺死

1、onStartCommand方法,返回START_STICKY

  在運行onStartCommand後service進程被kill後,那將保留在開始狀態,可是不保留那些傳入的intent。不久後service就會再次嘗試從新建立,由於保留在開始狀態,在建立 service後將保證調用onstartCommand。若是沒有傳遞任何開始命令給service,那將獲取到null的intent。android

   【結論】 手動返回START_STICKY,親測當service因內存不足被kill,當內存又有的時候,service又被從新建立,比較不錯,可是不能保證任何狀況下都被重建,好比進程被幹掉了…. app

2、提高service優先級

  在AndroidManifest.xml文件中對於intent-filter能夠經過android:priority = 「1000」這個屬性設置最高優先級,1000是最高值,若是數字越小則優先級越低,同時適用於廣播。動畫

3、提高service進程優先級

  Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先級自動進行進程的回收。Android將進程分爲6個等級,它們按優先級順序由高到低依次是:
1.前臺進程( FOREGROUND_APP)
2.可視進程(VISIBLE_APP )this

次要服務進程(SECONDARY_SERVER )
4.後臺進程 (HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)
當service運行在低內存的環境時,將會kill掉一些存在的進程。所以進程的優先級將會很重要,可使用startForeground 將service放到前臺狀態。這樣在低內存時被kill的概率會低一些。
在onStartCommand方法內添加以下代碼:rest

Notification notification = new Notification(R.drawable.ic_launcher,code

getString(R.string.app_name), System.currentTimeMillis());
     PendingIntent pendingintent = PendingIntent.getActivity(this, 0,
     new Intent(this, AppMain.class), 0);
     notification.setLatestEventInfo(this, "uploadservice", "請保持程序在後臺運行",
     pendingintent);
     startForeground(0x111, notification);

注意在onDestroy裏還須要stopForeground(true),運行時在下拉列表會看到本身的APP在:
【結論】若是在極度極度低內存的壓力下,該service仍是會被kill掉,而且不必定會restartxml

4、onDestroy方法裏重啓service

  直接在onDestroy()裏startService 
  或
  service +broadcast 方式,就是當service走ondestory的時候,發送一個自定義的廣播,當收到廣播的時候,從新啓動service;進程

【結論】當使用相似口口管家等第三方應用或是在setting裏-應用-強制中止時,APP進程可能就直接被幹掉了,onDestroy方法都進不來,因此仍是沒法保證~.~內存

5、監聽系統廣播判斷Service狀態

  經過系統的一些廣播,好比:手機重啓、界面喚醒、應用狀態改變等等監聽並捕獲到,而後判斷咱們的Service是否還存活,別忘記加權限啊。get

6、將APK安裝到/system/app,變身系統級應用

更多:

相關文章
相關標籤/搜索