亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

Android下寫一個永遠不會!被KILL掉的進程/服務

2019-11-02 14:33:26
字體:
來源:轉載
供稿:網友

  Android 系統對于內存管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控制程序的內存使用。當系統覺得當前的資源非常有限的時候,為了保證一些優先級高的程序能運行,就會殺掉一些他認為不重要的程序或者服務來釋放內存。這樣就能保證真正對用戶有用的程序仍然再運行。如果你的 Service 碰上了這種情況,多半會先被殺掉。但如果你增加 Service 的優先級就能讓他多留一會,我們可以用 setForeground(true) 來設置 Service 的優先級。

 為什么是 foreground ? 默認啟動的 Service 是被標記為 background,當前運行的 Activity 一般被標記為 foreground,也就是說你給 Service 設置了 foreground 那么他就和正在運行的 Activity 類似優先級得到了一定的提高。當讓這并不能保證你得 Service 永遠不被殺掉,只是提高了他的優先級。 有一個方法可以給你更清晰的演示,進入 $SDK/tools 運行命令 復制代碼# adb shell dumpsys activity|grep oom_adj      Running Norm Proc # 6: oom_adj=  0 ProcessRecord{43635cf0 12689:com.roiding.netraffic/10028}   Running Norm Proc # 5: oom_adj=  7 ProcessRecord{436feda0 12729:com.android.browser/10006}   Running Norm Proc # 4: oom_adj=  8 ProcessRecord{4367e838 12761:android.process.acore/10016}   Running Norm Proc # 3: oom_adj=  8 ProcessRecord{43691cd8 12754:com.google.process.gapps/10000}   Running PERS Proc # 1: oom_adj=-12 ProcessRecord{43506750 5941:com.android.phone/1001}   Running PERS Proc # 0: oom_adj=-100 ProcessRecord{4348fde0 5908:system/1000}復制代碼返回的一大堆東西,觀察 oom_adj 的值,如果是大于 8 一般就是屬于 backgroud 隨時可能被干掉,數值越小證明優先級越高,被干掉的時間越晚。你看phone的程序是 -12 說明電話就是電話,其他什么都干了了,也的能接電話對吧。另外還有一個 -100 的,更邪乎因為是 system 如果他也完蛋了,你得系統也就掛了。 我是天王蓋地虎的分割線          
琪琪影院[www.aikan.tv/special/qiqiyingyuan/]
                       從Android 1.5開始,一個已啟動的service可以調用startForeground(int, Notification)將service置為foreground狀態,調用stopForeground(boolean)將service置為 background狀態。 我們會在調用startForeground(int, Notification)傳入參數notification,它會在狀態欄里顯示正在進行的foreground service。background service不會在狀態欄里顯示。  在Android 1.0中,將一個service置為foreground狀態: setForeground(true); mNM.notify(id, notification);將一個service置為background狀態: mNM.cancel(id); setForeground(false);對比看出,在1.0 API中調用setForeground(boolean)只是簡單的改變service的狀態,用戶不會有任何覺察。新API中強制將 notification和改變service狀態的動作綁定起來,foreground service會在狀態欄顯示,而background service不會。 我是天王蓋地虎的分割線                                  通過在androidmanifest.xml中的application標簽中加入android:persistent="true"屬性后的確就能夠達到保證該應用程序所在進程不會被LMK殺死。但有個前提就是應用程序必須是系統應用,也就是說應用程序不能采用通常的安裝方式。必須將應用程序的apk包直接放到/system/app目錄下。而且必須重啟系統后才能生效。 除了一般的幾種優先級外,還存在著coreserver,system這樣的永遠不會被LMK回收的優先級。系統中的電話應用就是coreserver優先級的。 通過查看源代碼可以知道,只有應用程序的flag同時為FLAG_SYSTEM和FLAG_PERSISTENT時,才會被設置為coreserver優先級 if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))                == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {            app.persistent = true;            app.maxAdj = CORE_SERVER_ADJ;        }FLAG_SYSTEM在應用程序apk放在/system/app下時會被設置。所以才會出現只設置android:persistent="true"仍然會被殺死的情況。 測試時發現,將應用程序放到/system/app后不重啟系統,仍然會被識別為普通的進程。當系統重新啟動時,會在一開始就啟動該進程并把它優先級設置為coreserver。 通過dumpsys activity命令能夠很明顯的看出其中差別。 復制代碼Running processes (most recent first):    App  # 3: adj=   2/1 ProcessRecord{30858c20 1877:com.android.email/10014} (started-services)    PERS # 2: adj=-100/0 ProcessRecord{308fb390 1713:system/1000} (fixed)    App  # 1: adj=   0/0 ProcessRecord{30908198 1794:android.process.acore/10005} (top-activity)    PERS # 0: adj= -12/0 ProcessRecord{3090d488 1789:xiao.xiong.test/10026} (fixed)復制代碼而且adj=-12時,這個進程通過ddms手動stop后會立即啟動 我是天王蓋地虎的分割線                                  方法對于一個service,可以首先把它設為在前臺運行: 復制代碼public void MyService.onCreate() {        super.onCreate();        Notification notification = new Notification(android.R.drawable.my_service_icon,"my_service_name",System.currentTimeMillis());        PendingIntent p_intent = PendingIntent.getActivity(this, 0,                new Intent(this, MyMainActivity.class), 0);        notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!",p_intent);        Log.d(TAG, String.format("notification = %s", notification));        startForeground(0x1982, notification);   // notification ID: 0x1982, you can name it as you will.}復制代碼相較于/data/app下的應用,放在/system/app下的應用享受更多的特權,比如若在其Manifest.xml文件中設置persistent屬性為true,則可使其免受out-of-memory killer的影響。 如應用程序'Phone'的AndroidManifest.xml文件: <application android:name="PhoneApp"                 android:persistent="true"                 android:label="@string/dialerIconLabel"                 android:icon="@drawable/ic_launcher_phone">         ...    </application>設置后app提升為系統核心級別,任何情況下不會被kill掉, settings->applications里面也會屏蔽掉stop操作。 復制代碼這樣設置前的log:   Proc #19: adj=svc  /B 4067b028 255:com.xxx.xxx/10001 (started-services)    # cat /proc/255/oom_adj    4設置后的log:  PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)    # cat /proc/155/oom_adj     -12                # 這是CORE_SERVER_ADJ注:init進程的oom_adj為-16(即SYSTEM_ADJ): cat  /proc/1/oom_adj復制代碼Android相關部分分析在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼: 復制代碼final ProcessRecord addAppLocked(ApplicationInfo info) {        ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);         if (app == null) {            app = newProcessRecordLocked(null, info, null);            mProcessNames.put(info.processName, info.uid, app);            updateLruProcessLocked(app, true, true);        }             if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))                == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {            app.persistent = true;            app.maxAdj = CORE_SERVER_ADJ;             // 這個常數值為-12。        }            if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {            mPersistentStartingProcesses.add(app);            startProcessLocked(app, "added application", app.processName);        }             return app;    }復制代碼可見要想成為core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指的是應用位于/system/app下,FLAG_PERSISTENT就是指persistent屬性。 而對于frameworks/base/services/java/com/android/server/SystemServer.java,則調用ActivityManagerService.setSystemProcess(); 把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。 我是天王蓋地虎的分割線                                  Android中的進程是托管的,當
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品丝袜久久久久久不卡| 亚洲第一偷拍网| 欧美性生交xxxxx久久久| 国产精品亚洲一区二区三区| 国产精品自产拍高潮在线观看| 欧美成人亚洲成人| 国产精品视频yy9099| 欧美大成色www永久网站婷| 国产偷亚洲偷欧美偷精品| 中日韩美女免费视频网址在线观看| 成人有码在线视频| 91久久国产婷婷一区二区| 国产精品美女主播在线观看纯欲| 欧美黄色片免费观看| 性色av一区二区咪爱| 国产精品偷伦一区二区| 精品久久久久久久大神国产| 精品福利一区二区| 欧美大人香蕉在线| 在线成人免费网站| 久久精品99久久久香蕉| 日韩欧美一区二区在线| 欧美激情在线视频二区| 国产日产久久高清欧美一区| 亚洲国产精品yw在线观看| 亚洲激情电影中文字幕| 欧美精品生活片| 色偷偷88888欧美精品久久久| 国产婷婷色综合av蜜臀av| 日韩中文字幕欧美| 亚洲香蕉伊综合在人在线视看| 琪琪第一精品导航| 成人午夜激情免费视频| 久久久免费精品视频| 欧美日产国产成人免费图片| 综合欧美国产视频二区| 国产丝袜一区二区三区免费视频| 精品成人av一区| 日本久久久久久久久| 富二代精品短视频| 中文字幕亚洲精品| 亚洲欧美999| 在线观看久久久久久| 国产精品99久久久久久人| 精品一区二区电影| 中文字幕亚洲欧美在线| 夜夜躁日日躁狠狠久久88av| 亚洲片在线观看| 性欧美xxxx视频在线观看| 国内精品久久久久影院优| 色偷偷偷综合中文字幕;dd| 欧美黄色片在线观看| 亚洲精品日韩欧美| 精品久久久久久亚洲国产300| 亚洲最大福利网站| 中文字幕日韩av| 日韩成人在线观看| 日韩精品日韩在线观看| 欧美视频一区二区三区…| 欧美中文字幕在线视频| 欧美性受xxxx白人性爽| 精品国产91久久久久久| 日韩综合中文字幕| 亚洲人成在线免费观看| 黑人与娇小精品av专区| 国产99久久精品一区二区| 国产日韩欧美在线观看| 亚洲一二三在线| 亚洲欧美色婷婷| 国产婷婷成人久久av免费高清| 成人在线小视频| 欧美激情国产精品| 日韩国产一区三区| 亚洲影院高清在线| 精品视频在线导航| 精品性高朝久久久久久久| 亚洲韩国日本中文字幕| 久久国产精品久久久| 77777少妇光屁股久久一区| 欧美一区二区色| 日韩av资源在线播放| 国产亚洲一区二区在线| 精品中文字幕久久久久久| 久久综合88中文色鬼| 成人免费看片视频| 亚洲成人av在线| 色琪琪综合男人的天堂aⅴ视频| 欧美猛男性生活免费| 欧美性精品220| 成人黄色午夜影院| 欧美激情亚洲精品| 自拍偷拍亚洲区| 欧美日韩国内自拍| 国产精品久久综合av爱欲tv| www国产91| 欧美激情videoshd| 国产午夜精品一区二区三区| 91亚洲精品在线观看| 欧美视频专区一二在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美激情国产日韩精品一区18| 欧美怡红院视频一区二区三区| 亚洲国产精久久久久久| 欧美专区福利在线| 日韩久久精品成人| 蜜臀久久99精品久久久无需会员| 伊人久久久久久久久久| 日韩欧美一区视频| 欧美黑人性视频| 国产精品久久久久一区二区| 亚洲毛片一区二区| 日韩高清电影好看的电视剧电影| 久久综合久久八八| 精品动漫一区二区| 国产91精品视频在线观看| 国模视频一区二区三区| 日韩av在线免播放器| 亚洲一区二区日本| 国产精品欧美激情在线播放| 日本午夜在线亚洲.国产| 亚洲成人精品久久久| 亚洲精品久久久久久久久久久久| 国产午夜精品全部视频播放| 日本久久精品视频| 国产精品久久久久久久久久小说| 亚洲最大激情中文字幕| 91国产美女视频| 久久久久这里只有精品| 精品调教chinesegay| 亚洲午夜国产成人av电影男同| 国产午夜精品理论片a级探花| 国产精品美乳在线观看| 九九精品在线观看| 综合激情国产一区| 欧美有码在线观看| 91国产美女在线观看| 成人乱色短篇合集| 国产又爽又黄的激情精品视频| 国产精品久久久久久搜索| 久久久久久亚洲精品| 91情侣偷在线精品国产| 欧美黑人一区二区三区| 98精品国产自产在线观看| 亚洲色图13p| 色悠悠久久久久| 成人黄色网免费| 久久精品最新地址| 91精品国产高清久久久久久91| 日韩欧美一区二区三区久久| 成人免费网站在线| 一区二区欧美日韩视频| 97超级碰碰人国产在线观看| 97avcom| 色综合久久久久久中文网| 国产精品视频在线观看| 亚洲女同精品视频| 欧美精品久久久久久久久久| 欧美性黄网官网| 亚洲欧美www| 91po在线观看91精品国产性色| 日韩有码视频在线| 久久成人精品一区二区三区| 国产亚洲精品美女| 一区二区日韩精品|