進程、服務守護防殺的實現,對於每一位開發者來講,都是一部與某系統、某衛士、某助手、某管家、某大師鬥爭的血淚史。
咱們經常使用的進程守護的套路無外乎如下幾種,大部份內容摘錄自Never-say-Never的博客java
套路一.提升進程的優先級數值
對於Service被系統回收,通常作法是經過提升優先級能夠解決,在AndroidManifest.xml文件中對於intent-filter能夠經過android:priority = 「1000」這個屬性設置最高優先級,1000是最高值,若是數字越小則優先級越低。android
套路二.改變進程等級
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先級自動進行進程的回收。Android將進程分爲6個等級,它們按優先級順序由高到低依次是:shell
1.前臺進程( FOREGROUND_APP)
2.可視進程(VISIBLE_APP )
3.次要服務進程(SECONDARY_SERVER )
4.後臺進程 (HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)markdown
咱們能夠用 setForeground(true) 來設置 Service 的優先級。app
1.若是service正在調用onCreate,onStartCommand或者onDestory方法,那麼用於當前service的進程則變爲前臺進程以免被killed。
2.若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.
3.若是客戶端已經鏈接到service
(bindService),那麼擁有Service的進程則擁有最高的優先級,能夠認爲service是可見的。
4.若是service能夠使用startForeground(int,
Notification)方法來將service設置爲前臺狀態,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。
5.若是有其餘的應用組件做爲Service,Activity等運行在相同的進程中,那麼將會增長該進程的重要性。eclipse
套路三.設置 android:persistent屬性爲true
<application android:name="com.test.Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" <span style="color:#ff0000;"> android:persistent="true"</span> android:theme="@style/AppTheme" > </application>
這個屬性設置後,的確發現優先級提升很多,或許是至關於系統級的進程,可是仍是沒法保證存活ide
套路四.onDestory方法內調用廣播,重啓Service
當service執行了onDestory的時候,發送一個自定義的廣播,當收到廣播的時候,從新啓動servicethis
@Override public void onDestroy() { Intent sevice = new Intent(this, MainService.class); this.startService(sevice); super.onDestroy(); }
可是當使用相似於360衛士和騰訊管家等第三方應用或是在setting裏-應用-強制中止時,APP進程可能就直接被幹掉了,onDestroy方法都進不來,因此仍是沒法保證存活spa
套路五.監聽系統廣播判斷Service狀態
經過系統的一些廣播,好比:手機重啓、界面喚醒、應用狀態改變等等監聽並捕獲到,而後判斷咱們的Service是否還存活,記得加權限.net
<receiver android:name="com.dbjtech.acbxt.waiqin.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.intent.action.PACKAGE_RESTARTED" /> <action android:name="com.dbjtech.waiqin.destroy" /> </intent-filter> </receiver>
在BroadcastReceiver中:
@Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { System.out.println("手機開機了...."); startUploadService(context); } if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) { startUploadService(context); } }
這個方法監聽多了會致使Service很混亂,帶來諸多麻煩
套路六.將APK安裝到/system/app成爲系統級應用
使用ROOT過的手機
1.把代碼編寫好後,打包導出apk,copy到手機SD卡根目錄下。
2.手機鏈接eclipse,cmd: adb shell
3.切換root模式,輸入:su (若是root過就不會有錯誤)
4.設置System爲讀寫權限:mount –o remount rw /system (System默認爲只讀,沒法寫入,這一步很關鍵)
5.cd到sd卡跟目錄下,確認是否有咱們拷貝到sd卡根目錄下的apk(通常都是 storage/sdcard0)
shell@android :/ # cd storage/sdcard0
6.最後,咱們要把apk拷貝到 /System/app中