簡介:
在Android Services (后臺服務(wù)) 里面因俐,我們了解了Android四大組件之一的Service榴嗅,知道如何使用后臺服務(wù)進行來完成一些特定的任務(wù)蔼水。但是后臺服務(wù)在系統(tǒng)內(nèi)存不足的時候,可能會被系統(tǒng)殺死录肯。那么如何讓后臺服務(wù)盡量不被殺死呢?基本的解決思路主要有以下幾種:
1. 提高Service的優(yōu)先級:
為防止Service被系統(tǒng)回收吊说,可以嘗試通過提高服務(wù)的優(yōu)先級解決论咏,1000是最高優(yōu)先級,數(shù)字越小颁井,優(yōu)先級越低
android:priority="1000"
2.把service寫成系統(tǒng)服務(wù)厅贪,將不會被回收:
在Manifest.xml文件中設(shè)置persistent屬性為true,則可使該服務(wù)免受out-of-memory killer的影響雅宾。但是這種做法一定要謹慎养涮,系統(tǒng)服務(wù)太多將嚴重影響系統(tǒng)的整體運行效率。
3.將服務(wù)改成前臺服務(wù)foreground service:
重寫onStartCommand方法眉抬,使用StartForeground(int,Notification)方法來啟動service贯吓。
注:一般前臺服務(wù)會在狀態(tài)欄顯示一個通知,最典型的應用就是音樂播放器蜀变,只要在播放狀態(tài)下悄谐,就算休眠也不會被殺,如果不想顯示通知库北,只要把參數(shù)里的int設(shè)為0即可爬舰。
同時们陆,對于通過startForeground啟動的service,onDestory方法中需要通過stopForeground(true)來取消前臺運行狀態(tài)情屹。
這個方案也是本文目前準備詳細介紹的坪仇。
4.利用Android的系統(tǒng)廣播
利用ANDROID的系統(tǒng)廣播檢查Service的運行狀態(tài),如果被殺掉垃你,就再起來椅文,系統(tǒng)廣播是Intent.ACTION_TIME_TICK,這個廣播每分鐘發(fā)送一次蜡镶,我們可以每分鐘檢查一次Service的運行狀態(tài)雾袱,如果已經(jīng)被結(jié)束了,就重新啟動Service官还。
二芹橡、前臺服務(wù)
1.what
前臺服務(wù)是那些被認為用戶知道(用戶所認可的)且在系統(tǒng)內(nèi)存不足的時候不允許系統(tǒng)殺死的服務(wù)。前臺服務(wù)必須給狀態(tài)欄提供一個通知望伦,它被放到正在運行(Ongoing)標題之下——這就意味著通知只有在這個服務(wù)被終止或從前臺主動移除通知后才能被解除林说。
2.why
在一般情況下,Service幾乎都是在后臺運行屯伞,一直默默地做著辛苦的工作腿箩。但這種情況下,后臺運行的Service系統(tǒng)優(yōu)先級相對較低劣摇,當系統(tǒng)內(nèi)存不足時珠移,在后臺運行的Service就有可能被回收。
那么末融,如果我們希望Service可以一直保持運行狀態(tài)且不會在內(nèi)存不足的情況下被回收時钧惧,可以選擇將需要保持運行的Service設(shè)置為前臺服務(wù)。
3.how
本文按照做音樂播放器的思路勾习,做一下相關(guān)的說明浓瞪,如何使用前臺服務(wù)。
在完成Notification通知消息的構(gòu)建后巧婶,在Service的onStartCommand中可以使用startForeground方法來讓Android服務(wù)運行在前臺乾颁。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
startForeground(NOTIFICATION_ID, new Notification());
//服務(wù)被kill掉后自動重啟;
return START_REDELIVER_INTENT;
}
如果需要停止前臺服務(wù),可以使用stopForeground來停止正在運行的前臺服務(wù)艺栈。
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
}
到此為止英岭,我們基本上就學會了如何使用前臺服務(wù)了。
四:總結(jié)
- 前臺服務(wù)與普通服務(wù)的區(qū)別
前臺Service的系統(tǒng)優(yōu)先級更高湿右、不易被回收巴席;
前臺Service會一直有一個正在運行的圖標在系統(tǒng)的狀態(tài)欄顯示,下拉狀態(tài)欄后可以看到更加詳細的信息诅需,非常類似于通知的效果漾唉。