91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android基礎(七) – Service 保活

發布時間:2020-07-03 03:07:05 來源:網絡 閱讀:2197 作者:lm8751 欄目:移動開發

總結:大部分應用只需做1-2-3 步即,如業務要求比較高 可適當采用4.

1.修改onStartCommand函數返回值為START_STICKY。(資源緊張情況下 系統殺掉Service后會恢復,進入恢復隊列)(建議采用)

@Override

publicintonStartCommand(Intent intent,intflags,intstartId) {

    return  START_STICKY;

   //return super.onStartCommand(intent, flags, startId);

}

 2.提升service的優先級,設置android:priority=”1000″(建議采用)

<service

android:name=”…”

android:exported =”false”>

<!– 1000是最高優先級,數字越小,優先級越低 –>

<intent-filter android:priority=”1000″/>

</service>

 3.提升service進程優先級,為前臺進程  (建議采用)
          步驟一:新建前臺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次調用
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進程所領養,已經成為了孤兒進程. 但是這種方式比較消耗電量,并且由于不同手機系統定制的改變,當應用被強制停止時,父進程并不一定被真正殺死,因此在一些特定機型上是無法通過此方式進行判斷. 這里推薦使用liunx socket的方式進行類似心跳包的檢測,并且當觸發檢測Service是否被殺死之前,需要判斷應用是否已經被卸載,如果應用已經被卸載,則不再進行檢測Service行為,直接調用exit(0)退出子進程,避免浪費系統資源和消耗電量.

   可參照:https://github.com/CharonChui/DaemonService

注意: 目前在Android 5.0系統上會把fork出來的進程放到一個進程組里, 當程序主進程掛掉后,也會把整個進程組殺掉,因此用fork的方式也無法在Android5.0及以上系統實現守護進程. 這個是系統層面的限制,當然也是為了優化整個的系統環境,守護進程給手機帶來的體驗并不好

具體見源碼:

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.通過監聽系統廣播來把自己拉起來 (4.4系統以上 應用退出后 將不再接受系統廣播 ,實際效果不明顯)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜城县| 黄冈市| 宁河县| 公安县| 横峰县| 酒泉市| 岚皋县| 郎溪县| 台北市| 曲阜市| 张家港市| 武山县| 凉城县| 綦江县| 呼和浩特市| 麦盖提县| 浙江省| 义乌市| 临桂县| 德格县| 浦县| 息烽县| 绿春县| 威信县| 盐津县| 灵山县| 建平县| 达日县| 甘泉县| 衢州市| 吐鲁番市| 峨眉山市| 龙南县| 贡山| 济阳县| 新闻| 无锡市| 德庆县| 治多县| 沈阳市| 丰顺县|