總結:大部分應用只需做1-2-3 步即,如業(yè)務要求比較高 可適當采用4.
站在用戶的角度思考問題,與客戶深入溝通,找到撫順縣網(wǎng)站設計與撫順縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設計、外貿(mào)網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋撫順縣地區(qū)。
1.修改onStartCommand函數(shù)返回值為START_STICKY。(資源緊張情況下 系統(tǒng)殺掉Service后會恢復,進入恢復隊列)(建議采用)
@Override
publicintonStartCommand(Intent intent,intflags,intstartId) {
return START_STICKY;
//return super.onStartCommand(intent, flags, startId);
}
2.提升service的優(yōu)先級,設置android:priority=”1000″(建議采用)
<service
android:name=”…”
android:exported =”false”>
<!– 1000是最高優(yōu)先級,數(shù)字越小,優(yōu)先級越低 –>
<intent-filter android:priority=”1000″/>
</service>
3.提升service進程優(yōu)先級,為前臺進程 (建議采用)
步驟一:新建前臺Service (復制可用)
public class BootstrapService extends Service {
@Override public void onCreate() { super.onCreate(); startForeground(this); // 自己關閉自己 清除notification stopSelf(); }
@Override public void onDestroy() { super.onDestroy(); stopForeground(true); }
public static void startForeground(Service context) { NotificationManager nm = (NotificationManager)context. getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setContentTitle(“I’m running”) .setContentText(“”) .setWhen(System.currentTimeMillis()) .setPriority(Notification.PRIORITY_MIN) .setSmallIcon(R.drawable.notification_icon) .setAutoCancel(true); Notification notification = builder.build(); context.startForeground(8888, notification); } }
步驟二:在主Service 2次調(diào)用
public class MainService extends Service {
@Override public void onCreate() { super.onCreate();
//第一次設置前臺進程 BootstrapService.startForeground(this); //第二次設置前臺進程 為了清除notification Intent intent = new Intent(this, BootstrapService.class); startService(intent); }
@Override public void onDestroy() { super.onDestroy(); stopForeground(true); } }
4.守護進程(以下轉,部分room 有后臺保護進程功能)
使用Jni,在 c端 fork進程,檢測Service是否存活,若Service已被殺死,則進行重啟Service. 至于檢測方式,可以輪詢獲取子進程Pid,若為1, 則說明子進程被Init進程所領養(yǎng),已經(jīng)成為了孤兒進程. 但是這種方式比較消耗電量,并且由于不同手機系統(tǒng)定制的改變,當應用被強制停止時,父進程并不一定被真正殺死,因此在一些特定機型上是無法通過此方式進行判斷. 這里推薦使用liunx socket的方式進行類似心跳包的檢測,并且當觸發(fā)檢測Service是否被殺死之前,需要判斷應用是否已經(jīng)被卸載,如果應用已經(jīng)被卸載,則不再進行檢測Service行為,直接調(diào)用exit(0)退出子進程,避免浪費系統(tǒng)資源和消耗電量.
可參照:https://github.com/CharonChui/DaemonService
注意: 目前在Android 5.0系統(tǒng)上會把fork出來的進程放到一個進程組里, 當程序主進程掛掉后,也會把整個進程組殺掉,因此用fork的方式也無法在Android5.0及以上系統(tǒng)實現(xiàn)守護進程. 這個是系統(tǒng)層面的限制,當然也是為了優(yōu)化整個的系統(tǒng)環(huán)境,守護進程給手機帶來的體驗并不好
具體見源碼:
http://androidxref.com/5.0.0_r2/xref/frameworks/base/services/core/java/com/android/server/am/Proce***ecord.java
補:
Android5.0 以上目前已有人使用黑科技攻克,部分機型可能無法起到作用,但思路很值得借鑒,代碼結構也不錯, 具體方案見:
https://github.com/Marswin/MarsDaemon
5.復寫Service onDestory()方法,重啟服務。(如進程殺死無效)
6.android:persistent=“true” (需root權限才有效 ,基本無實際應用價值)
7.通過監(jiān)聽系統(tǒng)廣播來把自己拉起來 (4.4系統(tǒng)以上 應用退出后 將不再接受系統(tǒng)廣播 ,實際效果不明顯)
本文標題:Android基礎(七)–Service?;?/a>
網(wǎng)頁URL:http://aaarwkj.com/article0/peigio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、品牌網(wǎng)站建設、App設計、小程序開發(fā)、虛擬主機、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)