Android在第三方應用程序系統應用盡早開始,殺死自己主動的第三方應用程序,以重新啟動...

1.為什么第三方應用程序可能早于System的app啟動?

????? Android能夠查閱了,這里就不細述了,這里不闡述ROM啟動還有bootloader。軟件啟動的大致流程應該是

  • 啟動kernel
  • 執行servicemanager 把一些native的服務用命令啟動起來(包含wifi, power, rild, surfaceflinger, mediaserver等等)
  • 啟動Dalivk中的第一個進程Zygote -> 啟動java 層的系統服務system_server(包含PowerManagerService, ActivityManagerService , telephony.registry, DisplayManagerService等等)該服務中的這些部件跟native的那些服務關聯在一起
  • 啟動Luncher和Persistent的App,該程序是系統級的在AndroidManifest.xml里聲明android:persistent="true"
  • 發出ACTION_BOOT_COMPLETED廣播給其它應用。

?????? 在這里須要注意的是聲明android:persistent屬性為true的APP被kill掉后還是會自己主動重新啟動的。系統中我們已知android:persistent屬性為true的APP肯定有Phone App,也就是說第三方應用應當至少晚于Phone APP啟動,怎樣推斷呢?最簡單的辦法看其PID的大小,PID值越小越先啟動。有其第三方應用能夠先于Phone APP啟動。我們探其應用的AndroidManifest.xml (PS:怎樣看APK的代碼,網上有你懂的apktool等),發現其在AndroidManifest里定義的靜態Receiver的intent-filter的屬性例如以下:

       <receiver android:name="com.anguanjia.safe.AAAReceiver"><intent-filter android:priority="2147483647"></span><action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /><action android:name="android.net.wifi.WIFI_STATE_CHANGED" /><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /><action android:name="android.intent.action.ANY_DATA_STATE" /><action android:name="android.net.wifi.STATE_CHANGE" /></intent-filter><intent-filter android:priority="2147483647"><action android:name="android.intent.action.MEDIA_UNMOUNTED" /><action android:name="android.intent.action.MEDIA_MOUNTED" /><action android:name="android.intent.action.MEDIA_REMOVED" /><action android:name="android.intent.action.MEDIA_CHECKING" /><action android:name="android.intent.action.MEDIA_EJECT" /><data android:scheme="file" /></intent-filter>

2147483647 這個值是什么?好大,哦,原來是int的最大值!

我們來看下google 文檔

android:priority
??? The priority that should be given to the parent component with regard to handling intents of the type described by the filter. This attribute has meaning for both activities and broadcast receivers:

??????? It provides information about how able an activity is to respond to an intent that matches the filter, relative to other activities that could also respond to the intent. When an intent could be handled by multiple activities with different priorities, Android will consider only those with higher priority values as potential targets for the intent.

??????? It controls the order in which broadcast receivers are executed to receive broadcast messages. Those with higher priority values are called before those with lower values. (The order applies only to synchronous messages; it's ignored for asynchronous messages.)

??? Use this attribute only if you really need to impose a specific order in which the broadcasts are received, or want to force Android to prefer one activity over others.

??? The value must be an integer, such as "100". Higher numbers have a higher priority. The default value is 0. The value must be greater than -1000 and less than 1000.

??????? 這個值是receiver的優先級,值越大優先級越高,按優先順序運行,可是文檔介紹優先級值大小是-1000~1000. 該應用的是int的最大值, 但android平臺沒有對android:priority值進行檢查。在開機后該應用Receiver的intent-filter的優先級最高,在該filter里的intent被系統發送出來(android.intent.action.MEDIA_MOUNTE, android.net.wifi.WIFI_STATE_CHANGED等等),這個時候App會依據這個intent而被啟動起來。

???????? 這里須要注意的是該Receiver是個靜態的,一定是要注冊在AndroidManifest里。

當Wifi成功注冊后會發出WIFI_STATE_CHANGED的消息, 或者其它的部件完畢一些事件后也會發出類似的消息。而這些消息的發出又早于屬性為persistent的系統級APP的啟動, 由此就會發生第三方應用早于系統級APP的啟動的情況。


2. 在Android手機上為什么我想全然關閉的程序關不了?

??????? 有一種理論是Android手機為了有更好的用戶體驗。會后臺自己主動啟動一些程序。 這樣我們前臺在操作的時候會感覺手機更流暢平滑。

可是假設程序執行過多。對CPU 內存的開銷過大,往往會導致系統越用越慢,乃至手機掛掉的問題,在內存管理這快Android有兩種機制去解決問題,一個是在framework層在 trimApplication方法中去實現,另外一個就是在kernel里的lowmemorykiller。 這里不再細述。
??????? 可是對于用戶來說。我就是想全然關閉第三方程序,以免過多使用我的流量或者偷偷的做一些我不希望的操作。貌似沒有辦法去關閉,那為什么呢? 我這里先講述當中一種情況。
????????? Service顧名思義是服務。執行在前后臺后都能夠,即能夠執行在當前進程也能夠執行在其它的進程里,Service能夠為多個APP共享使用,是通過binder機制來實現的。當我Kill掉一個帶有服務的進程(沒有調用stopService()), 過一會該應用會自己主動重新啟動。以下是代碼的調用順序。自下往上查看。

com.android.server.am.ActiveServices.scheduleServiceRestartLocked(ActiveServices.java)

com.android.server.am.ActiveServices.killServicesLocked (ActiveServices.java)

com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

??????? 從代碼流程上我們看出該service被restart。進程也依據該service啟動起來, service就執行在重新啟動的進程里。

??????? 在這樣的情況下是不是就真沒辦法了呢,當然不是。假設我們在service中覆蓋onStartCommand這個函數而且返回值為START_NOT_STICKY,在我們kill該進程后則不會自己主動重新啟動,我們想關閉的應用也能夠全然關閉了。不會再自己主動重新啟動了。

    public int onStartCommand(Intent intent, int flags, int startId) {return START_NOT_STICKY;}

Framwork實現代碼

frameworks/base/services/java/com/android/server/am/ActiveServices.javacase Service.START_NOT_STICKY: {// We are done with the associated start arguments.r.findDeliveredStart(startId, true);if (r.getLastStartId() == startId) {// There is no more work, and this service// doesn't want to hang around if killed.r.stopIfKilled = true;   // 該變量設置為true}break;}if (sr.startRequested && (sr.stopIfKilled || canceled)) {    //進入到該條件中if (sr.pendingStarts.size() == 0) {sr.startRequested = false;if (sr.tracker != null) {sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),SystemClock.uptimeMillis());}if (!sr.hasAutoCreateConnections()) {// Whoops, no reason to restart!bringDownServiceLocked(sr);  //運行在這里。不會重新啟動App}}}

??????? 重寫onStartCommand方法且返回值為START_NOT_STICKY的代碼調用順序,自下而上查看。

com.android.server.am.ActiveServices.bringDownServiceLocked(ActiveServices.java)

com.android.server.am.ActiveServices.killServicesLocked(ActiveServices.java)

com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.appDiedLocked(Activi tyManagerService.java)

com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

? ?? ?? 附上Google doc 對于onStartCommand返回值的說明

For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand():START_STICKY is used for services that are explicitly started and stopped as needed, whileSTART_NOT_STICKY orSTART_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them. See the linked documentation for more detail on the semantics.

?????? 在這里對這個返回值做下解釋:

當服務進程因某種原因(內存不夠,強制關閉等)被kill掉時,START_STICKY再次,在系統中創建了后有足夠的內存service, 在onStartCommand在handle它是null intent.

START_NOT_STICKY通知系統不會再次創建service. 另一種回報值START_REDELIVER_INTENT再創service而伴隨著原intent圍棋處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 11 新特性:列表模式匹配

之前使用模式匹配&#xff0c;可以測試表達式結果是否等于指定的常量或者在某個范圍內&#xff1a;public static string Demo(int number) {return number switch{100 > "A",>90 >"B",_ > "C"}; }上面的代碼&#xff0c;執行邏輯如…

裝飾一個類及內部方法

通過裝飾器函數修改一個類屬性class MyClass:NAME My CLASS HAHAHAdef __init__(self):passprint(MyClass.__dict__[NAME])My CLASS HAHAHA等價于&#xff1a;def setname(name):def warpper(cls): cls.NAME namereturn clsreturn warppersetname(MY CLASS enen) #class M…

G2 2.0 更靈活、更強大、更完備的可視化引擎!

概述 G2作為一款技術產品&#xff0c;自誕生以來&#xff0c;服務于廣大的Web工程師群體和一部分數據分析師。一直來&#xff0c;G2 因其易用的語法和扎實的可視化理論基礎&#xff0c;廣受使用者好評。G2 1.x 的可視化能力已經非常強大&#xff0c;使用者已經能夠在掌握圖形語…

C語言試題十六之寫刪除字符串中指定下標的字符。其中,a指向原字符串,刪除后的字符串存放在b所指的數組中,n中存放指定的下標。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

《iVX 高仿美團APP制作移動端完整項目》07 會員頁制作

會員頁如下&#xff1a; 一、會員頁標題制作 會員頁的標題是頂部的提示字樣&#xff0c;該字樣咱們可以分析&#xff0c;可以使用兩個文本組件&#xff0c;每個占據一行&#xff1a; 首先咱們創建一個頁面命名為會員中心&#xff1a; 接著在會員中心下創建一個行&#xff…

【ArcGIS風暴】ArcGIS添加超鏈接的兩種方法詳解

文章目錄 1. 在識別對話框中添加超鏈接2. 利用屬性字段添加超鏈接在ArcGIS中,可以很方便的設置文檔超鏈接和URL超鏈接,設置完成后,只需要點擊某個圖斑就可以跳到指定的地址。本文詳細講解ArcGIS中超鏈接的設置方法。 1. 在識別對話框中添加超鏈接 啟動軟件,加載甘肅省行政…

Android Studio目錄結構分析

Android studio 目錄結構1. .gradleGradle編譯系統&#xff0c;版本由wrapper指定2. .ideaAndroid Studio IDE所需要的文件3. app3.1 app/buildapp模塊編譯輸出的文件3.2 app/libs放置引用的類庫文件3.3 app/src放置應用的主要文件目錄3.4 app/.gitgnoregit使用的ignore文件3.5…

《iVX 高仿美團APP制作移動端完整項目》08 會員頁 標題、會員卡 制作

一、分類制作 我們接著往下制作該頁的下半部分內容&#xff1a; 由于對應最下部分的商家推薦重復&#xff0c;直接復制即可&#xff0c;在此不做過多的講解&#xff1a; 接下來我們創建一行命名為內容&#xff0c;用以作為下半部分的容器&#xff1a; 接著我們制作第一個種…

C語言試題十七之用來求數組的最大元素在數組中的下標并存放在k所指的儲存單元中

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

微軟AI插件Github Copilot初體驗

前言上個月看到了一款插件 微軟 GitHub AI 編程工具 Copilot于是就想嘗嘗鮮&#xff0c;但是GitHub Copilot是需要申請的&#xff0c;只有申請通過的才能使用這款插件。就在今天我收到審核通過的郵件。于是想看看這插件是不是像其它網友說的那樣強&#xff01;使用于是打開了我…

Firefox about

在firefox的地址欄輸入about:about,然后看一下各個鏈接.有的鏈接有具體的用途,有的鏈接瘋言瘋語,并無軟用. about:about集中了火狐瀏覽器的全部用戶界面,平時常見的preferences,startpage,add-ons等都可以在此處見到. about:mozilla是mozilla之書,它仿照圣經的語言風格,講述了m…

關于互斥鎖,條件變量的內核源碼解析

一、解決問題和適用范圍 主要是用來等待一個條件&#xff0c;這個條件可能需要另一個線程來滿足這個條件。這個和我們平常適用的pthread_mutex_lock的最大不同在于后者保護的一般是一個代碼段(也就是關鍵區)&#xff0c;或者一個變量&#xff0c;但是由于一般來說這個變量的訪問…

【CASS精品教程】CASS 9.2繪制地籍圖詳細實驗案例教程

文章目錄 4.1 繪制地籍圖4.1.1 生成平面圖4.1.2 生成權屬信息數據文件4.1.3 繪權屬地籍圖4.1.4 圖形編輯4.3 繪制宗地圖4.3.1 單塊宗地4.3.2 批量處理4.4 繪制地籍表格4.4.1 界址點成果表4.4.2 界址點坐標表4.4.3 以街坊為單位界址點坐標表4.4.4 以街道為單位宗地面積匯總表4.4…

jquery.cookie.js 使用小結

先引入jquery&#xff0c;再引入&#xff1a;jquery.cookie.js添加一個"會話cookie"$.cookie(the_cookie, the_value);這里沒有指明 cookie有效時間&#xff0c;所創建的cookie有效期默認到用戶關閉瀏覽器為止&#xff0c;所以被稱為 “會話cookie&#xff08;sessio…

Android開發 人民幣符號(¥)顯示不一致的問題

不小心踩了個坑&#xff0c;發現這個人民幣符號在不同機器上顯示不一致&#xff0c;有的顯示一橫&#xff0c;有的顯示兩橫。 百度查了一下&#xff0c;找到好很多解決辦法&#xff0c;改字體&#xff0c;用圖片等等。 最后發現原來用的是全角的“&#xffe5;”的原因&#xf…

《iVX 高仿美團APP制作移動端完整項目》09 訂單頁制作

訂單頁制作比較簡單&#xff0c;界面如下&#xff1a; 一、標題 首先創建一個頁面&#xff0c;命名為訂單頁&#xff0c;并且給予背景色為黃色&#xff1a; 隨后創建一個行&#xff0c;命名為主要并給予對應的基礎屬性&#xff1a; 接著給予這個主要行對應的上下內邊距使其…

AutoDesk CAD 2014安裝VBA Enabler圖文教程(附AutoCAD_2014_VBA_Win_64bit下載)

在利用CASS將dwg地形圖轉為ArcGIS支持的Shapefile格式數據時,為了提高轉換效率,通常我們會寫一些VBA代碼來實現,但是VBA不提供與AutoCAD OEM 安裝介質,需要單獨下載VBA環境。 Visual Basic for Applications (VBA) 引擎不再提供與 AutoCAD OEM 安裝介質。 請聯系您的 Auto…

C語言試題十八之根據以下攻勢計算s,計算結果作為函數值返回;n通過形參傳入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 編寫函數f…

開源項目 英雄聯盟 之WPF

WPF 英雄聯盟作者&#xff1a;Devncore 組織 來自 韓國&#xff0c;首爾原文鏈接&#xff1a;https://github.com/devncore/leagueoflegends感謝分享者晨晞gg[1]&#xff1b;框架使用.NET6&#xff1b;C# 10.0;Visual Studio 2022;您可以了解如何正確實施 WPF 項目。描述了如何…

1055 最長等差數列

1055 最長等差數列基準時間限制&#xff1a;2 秒 空間限制&#xff1a;262144 KB N個不同的正整數&#xff0c;找出由這些數組成的最長的等差數列。 例如&#xff1a;1 3 5 6 8 9 10 12 13 14等差子數列包括(僅包括兩項的不列舉&#xff09;1 3 51 5 9 133 6 9 123 8 135 9 136…