article class="_2rhmJa"

成都創(chuàng)新互聯(lián)公司專注于原陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供原陽營銷型網(wǎng)站建設(shè),原陽網(wǎng)站制作、原陽網(wǎng)頁設(shè)計、原陽網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造原陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供原陽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
Android 設(shè)備開機自啟動的可以用廣播實現(xiàn),因為 Android 設(shè)備開機時會發(fā)送一條開機廣播 "android.intent.action.BOOT_COMPLETED"。接收后實現(xiàn)啟動就完成了。
接下來是準(zhǔn)備工作
如果按照上面的全部步驟后操作后,重啟沒有自動啟動程序,怎么辦呢?是怎么回事呢?
*那么首先請檢查一下你的手機是不是安裝了360等安全助手之類的軟件,如果有,請在軟件的自啟動軟件管理中將app設(shè)置為允許
*我的手機沒有安裝這些軟件,但是手機中自帶了安全助手,有的手機系統(tǒng)設(shè)置里面自帶了自啟動軟件管理的功能 ,所以在這里將我們的app設(shè)置為允許開機啟動),重啟手機,測試是否成功。
然而并沒有成功
接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對應(yīng)的action和uses-permission沒有一起添加
(2)、應(yīng)用安裝到了sd卡內(nèi),安裝在sd卡內(nèi)的應(yīng)用是收不到BOOT_COMPLETED廣播的
(3)、系統(tǒng)開啟了Fast Boot模式,這種模式下系統(tǒng)啟動并不會發(fā)送BOOT_COMPLETED廣播
(4)、應(yīng)用程序安裝后重來沒有啟動過,這種情況下應(yīng)用程序接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之后,系統(tǒng)為了加強了安全性控制,應(yīng)用程序安裝后或是(設(shè)置)應(yīng)用管理中被強制關(guān)閉后處于stopped狀態(tài),在這種狀態(tài)下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標(biāo)志,而默認(rèn)所有系統(tǒng)廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒法通過系統(tǒng)廣播自啟動了。所以Android3.1之后
(1)、應(yīng)用程序無法在安裝后自己啟動
(2)、沒有ui的程序必須通過其他應(yīng)用激活才能啟動,如它的Activity、Service、Content Provider被其他應(yīng)用調(diào)用。
存在一種例外,就是應(yīng)用程序被adb push you.apk /system/app/下是會自動啟動的,不處于stopped狀態(tài)。
并不太懂 我的APP啟動后 已經(jīng)收到廣播
第一種方式 我再模擬器上 測試 可以 android 9.0版本
桌面設(shè)置也會把你的app當(dāng)成一個桌面主題,還有一個選項是系統(tǒng)桌面,你需要設(shè)置成自己的app
如果找不到桌面設(shè)置選項,可以從手機設(shè)置–應(yīng)用程序-查看所有應(yīng)用程序(包括系統(tǒng)的應(yīng)用程序),找到桌面程序之類的字眼的應(yīng)用,清楚其默認(rèn)設(shè)置。
翻譯自:
這篇文章講解當(dāng)用戶點擊應(yīng)用圖標(biāo)時,安卓如何啟動你的應(yīng)用。安卓系統(tǒng)做了很多幕后工作,來使得你的launch activity對用戶可見。本文通過重要階段的講解和調(diào)用序列詳細(xì)講解這一過程。
安卓應(yīng)用在這兩個方面是獨特的:
多個入口點 :Android應(yīng)用程序由不同的組件組成,它們可以調(diào)用其他應(yīng)用程序擁有的組件。這些組件大致對應(yīng)于任何應(yīng)用程序的多個入口點。因此,它們不同于具有像main()方法那樣的單個入口點的傳統(tǒng)應(yīng)用程序。
擁有自己的小世界 :每個Android應(yīng)用程序都生活在自己的世界中,它在單獨的進(jìn)程中運行,擁有自己的Dalvik VM實例,并分配有唯一的用戶ID。
必要時會啟動Android進(jìn)程。
每當(dāng)用戶或其他系統(tǒng)組件請求執(zhí)行屬于您應(yīng)用程序的組件(可能是服務(wù),活動或意圖接收器)時,Android系統(tǒng)都會為您的應(yīng)用程序啟動一個新進(jìn)程(如果尚未運行)。通常,進(jìn)程一直運行直到被系統(tǒng)殺死。應(yīng)用程序流程是按需創(chuàng)建的,在您看到應(yīng)用程序的啟動活動啟動并運行之前,發(fā)生了許多事情。
每個應(yīng)用程序都在其自己的進(jìn)程中運行 :默認(rèn)情況下,每個Android應(yīng)用程序都在其自己的Android進(jìn)程中運行,而這個進(jìn)程只不過是一個Linux進(jìn)程,而該進(jìn)程首先需要一個執(zhí)行線程。例如,當(dāng)您單擊電子郵件中的超鏈接時,網(wǎng)頁將在瀏覽器窗口中打開。您的郵件客戶端和瀏覽器是兩個單獨的應(yīng)用程序,它們分別在兩個單獨的進(jìn)程中運行。click事件使Android平臺啟動新進(jìn)程,以便它可以在其自身進(jìn)程的上下文中實例化瀏覽器活動。這對于應(yīng)用程序中的任何其他組件同樣適用。
讓我們退后一會兒,快速瀏覽一下系統(tǒng)啟動過程。與大多數(shù)基于Linux的系統(tǒng)一樣,啟動加載程序在啟動時將加載內(nèi)核并啟動init進(jìn)程。然后,init會生成稱為“守護(hù)程序”的低級Linux進(jìn)程,例如android debug守護(hù)程序,USB守護(hù)程序等。這些守護(hù)程序通常處理低級硬件接口,包括無線電接口。
然后,初始化過程會啟動一個非常有趣的過程,稱為“zygote'。
顧名思義,這是其余Android應(yīng)用程序的開始。這是初始化Dalvik虛擬機的第一個實例的過程。它還預(yù)加載Android應(yīng)用程序框架和系統(tǒng)上安裝的各種應(yīng)用程序使用的所有常見類。因此,它準(zhǔn)備進(jìn)行復(fù)制。它統(tǒng)計偵聽套接字接口上的將來請求,以產(chǎn)生新的虛擬機(VM)來管理新的應(yīng)用程序進(jìn)程。收到新請求后,它會分叉以創(chuàng)建一個新進(jìn)程,該進(jìn)程將獲取預(yù)先初始化的VM實例。
zygote之后,init啟動運行時過程。
然后zygote分叉以啟動一個名為System server的托管良好的進(jìn)程。系統(tǒng)服務(wù)器在其自己的上下文中啟動所有核心平臺服務(wù),例如活動管理器服務(wù)和硬件服務(wù)。
此時,完整的堆棧已準(zhǔn)備就緒,可以啟動第一個應(yīng)用程序流程-主頁應(yīng)用程序,該應(yīng)用程序顯示主屏幕(也稱為啟動器應(yīng)用程序)。
click事件被轉(zhuǎn)換為 startActivity(intent), 并通過Binder IPC路由到 ActivityManagerService 。ActvityManagerService執(zhí)行多個步驟
如您所見,當(dāng)用戶單擊圖標(biāo)并啟動新應(yīng)用程序時,許多事情發(fā)生在幕后。這是全圖:
流程創(chuàng)建:
ActivityManagerService 通過調(diào)用 startProcessLocked() 方法創(chuàng)建一個新進(jìn)程,該方法通過套接字連接將參數(shù)發(fā)送到Zygote進(jìn)程。Zygote派生自己并調(diào)用 ZygoteInit.main() ,然后實例化 ActivityThread 對象并返回新創(chuàng)建的進(jìn)程的進(jìn)程ID。
默認(rèn)情況下,每個進(jìn)程都有一個線程。主線程有一個 Looper 實例來處理來自消息隊列的消息,并且它在 run() 方法的每次迭代中都調(diào)用 Looper.loop() 。 Looper 的工作是從消息隊列中彈出消息并調(diào)用相應(yīng)的方法來處理它們。然后,ActivityThread通過隨后調(diào)用 Looper.prepareLoop() 和 Looper.loop()來 啟動消息循環(huán)。
以下序列詳細(xì)捕獲了調(diào)用序列:
figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 20px; margin-left: auto; margin-right: auto; max-width: 728px; font-size: 14px; color: rgb(117, 117, 117); margin-top: 10px; text-align: center;"Android應(yīng)用啟動:單擊事件以執(zhí)行Looper調(diào)用順序/figcaption
應(yīng)用程序綁定:
下一步是將此新創(chuàng)建的過程附加到特定應(yīng)用程序。這是通過在線程對象上調(diào)用 bindApplication() 來完成的。此方法將 BIND_APPLICATION 消息發(fā)送到消息隊列。該消息由 Handler 對象檢索,該對象隨后調(diào)用 handleMessage() 方法以觸發(fā)特定于消息的操作 -handleBindApplication() 。此方法調(diào)用 makeApplication() 方法,該方法將應(yīng)用程序特定的類加載到內(nèi)存中。
下圖描述了該調(diào)用序列。
figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 20px; margin-left: auto; margin-right: auto; max-width: 728px; font-size: 14px; color: rgb(117, 117, 117); margin-top: 10px; text-align: center;"Android應(yīng)用啟動:BIND_APPLICATION消息處理/figcaption
啟動活動:
在上一步之后,系統(tǒng)包含負(fù)責(zé)應(yīng)用程序的進(jìn)程,并將應(yīng)用程序類加載到進(jìn)程的私有內(nèi)存中。在新創(chuàng)建的流程和現(xiàn)有流程之間,啟動活動的調(diào)用順序很常見。
實際的啟動過程從 realStartActivity() 方法開始, 該 方法在應(yīng)用程序線程對象上調(diào)用 sheduleLaunchActivity() 。此方法將 LAUNCH_ACTIVITY 消息發(fā)送到消息隊列。該消息由 handleLaunchActivity() 方法處理,如下所示。
假設(shè)用戶單擊“視頻瀏覽器”應(yīng)用程序。啟動該活動的調(diào)用順序如圖所示。
figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 20px; margin-left: auto; margin-right: auto; max-width: 728px; font-size: 14px; color: rgb(117, 117, 117); margin-top: 10px; text-align: center;"Android應(yīng)用啟動: LAUNCH_ACTIVITY消息處理 /figcaption
該活動通過 onCreate() 方法調(diào)用開始其托管生命周期。該活動通過 onRestart() 調(diào)用進(jìn)入前臺,并通過 onStart() 調(diào)用開始與用戶進(jìn)行交互。
當(dāng)按下Android設(shè)備電源鍵時究竟發(fā)生了什么?
Android的啟動過程是怎么樣的?
什么是Linux內(nèi)核?
桌面系統(tǒng)linux內(nèi)核與Android系統(tǒng)linux內(nèi)核有什么區(qū)別?
什么是引導(dǎo)裝載程序?
什么是Zygote?
什么是X86以及ARM linux?
什么是init.rc?
什么是系統(tǒng)服務(wù)?
當(dāng)我們想到Android啟動過程時,腦海中總是冒出很多疑問。本文將介紹Android的啟動過程,希望能幫助你找到上面這些問題的答案。
Android是一個基于Linux的開源操作系統(tǒng)。x86(x86是一系列的基于intel 8086 CPU的計算機微處理器指令集架構(gòu))是linux內(nèi)核部署最常見的系統(tǒng)。然而,所有的Android設(shè)備都是運行在ARM處理器(ARM 源自進(jìn)階精簡指令集機器,源自ARM架構(gòu))上,除了英特爾的Xolo設(shè)備()。Xolo來源自凌動1.6GHz x86處理器。Android設(shè)備或者嵌入設(shè)備或者基于linux的ARM設(shè)備的啟動過程與桌面版本相比稍微有些差別。這篇文章中,我將解釋Android設(shè)備的啟動過程。深入linux啟動過程是一篇講桌面linux啟動過程的好文。
當(dāng)你按下電源開關(guān)后Android設(shè)備執(zhí)行了以下步驟。
此處圖片中step2中的一個單詞拼寫錯了,Boot Loaeder應(yīng)該為Boot Loader(多謝@jameslast 提醒)
第一步:啟動電源以及系統(tǒng)啟動
當(dāng)電源按下,引導(dǎo)芯片代碼開始從預(yù)定義的地方(固化在ROM)開始執(zhí)行。加載引導(dǎo)程序到RAM,然后執(zhí)行。
第二步:引導(dǎo)程序
引導(dǎo)程序是在Android操作系統(tǒng)開始運行前的一個小程序。引導(dǎo)程序是運行的第一個程序,因此它是針對特定的主板與芯片的。設(shè)備制造商要么使用很受歡迎的引導(dǎo)程序比如redboot、uboot、qi bootloader或者開發(fā)自己的引導(dǎo)程序,它不是Android操作系統(tǒng)的一部分。引導(dǎo)程序是OEM廠商或者運營商加鎖和限制的地方。
引導(dǎo)程序分兩個階段執(zhí)行。第一個階段,檢測外部的RAM以及加載對第二階段有用的程序;第二階段,引導(dǎo)程序設(shè)置網(wǎng)絡(luò)、內(nèi)存等等。這些對于運行內(nèi)核是必要的,為了達(dá)到特殊的目標(biāo),引導(dǎo)程序可以根據(jù)配置參數(shù)或者輸入數(shù)據(jù)設(shè)置內(nèi)核。
Android引導(dǎo)程序可以在bootablebootloaderlegacyusbloader找到。
傳統(tǒng)的加載器包含的個文件,需要在這里說明:
init.s初始化堆棧,清零BBS段,調(diào)用main.c的_main()函數(shù);
main.c初始化硬件(鬧鐘、主板、鍵盤、控制臺),創(chuàng)建linux標(biāo)簽。
更多關(guān)于Android引導(dǎo)程序的可以在這里了解。
第三步:內(nèi)核
Android內(nèi)核與桌面linux內(nèi)核啟動的方式差不多。內(nèi)核啟動時,設(shè)置緩存、被保護(hù)存儲器、計劃列表,加載驅(qū)動。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件,然后啟動root進(jìn)程或者系統(tǒng)的第一個進(jìn)程。
第四步:init進(jìn)程
init是第一個進(jìn)程,我們可以說它是root進(jìn)程或者說有進(jìn)程的父進(jìn)程。init進(jìn)程有兩個責(zé)任,一是掛載目錄,比如/sys、/dev、/proc,二是運行init.rc腳本。
init進(jìn)程可以在/system/core/init找到。
init.rc文件可以在/system/core/rootdir/init.rc找到。
readme.txt可以在/system/core/init/readme.txt找到。
對于init.rc文件,Android中有特定的格式以及規(guī)則。在Android中,我們叫做Android初始化語言。
Action(動作):動作是以命令流程命名的,有一個觸發(fā)器決定動作是否發(fā)生。
語法
1
2
3
4
5
; html-script: false ]
on trigger
command
command
command
Service(服務(wù)):服務(wù)是init進(jìn)程啟動的程序、當(dāng)服務(wù)退出時init進(jìn)程會視情況重啟服務(wù)。
語法
1
2
3
4
5
; html-script: false ]
service name pathname [argument]*
option
option
...
Options(選項)
選項是對服務(wù)的描述。它們影響init進(jìn)程如何以及何時啟動服務(wù)。
咱們來看看默認(rèn)的init.rc文件。這里我只列出了主要的事件以及服務(wù)。
Table
Action/Service
描述
on early-init
設(shè)置init進(jìn)程以及它創(chuàng)建的子進(jìn)程的優(yōu)先級,設(shè)置init進(jìn)程的安全環(huán)境
on init
設(shè)置全局環(huán)境,為cpu accounting創(chuàng)建cgroup(資源控制)掛載點
on fs
掛載mtd分區(qū)
on post-fs
改變系統(tǒng)目錄的訪問權(quán)限
on post-fs-data
改變/data目錄以及它的子目錄的訪問權(quán)限
on boot
基本網(wǎng)絡(luò)的初始化,內(nèi)存管理等等
service servicemanager
啟動系統(tǒng)管理器管理所有的本地服務(wù),比如位置、音頻、Shared preference等等…
service zygote
啟動zygote作為應(yīng)用進(jìn)程
在這個階段你可以在設(shè)備的屏幕上看到“Android”logo了。
第五步
在Java中,我們知道不同的虛擬機實例會為不同的應(yīng)用分配不同的內(nèi)存。假如Android應(yīng)用應(yīng)該盡可能快地啟動,但如果Android系統(tǒng)為每一個應(yīng)用啟動不同的Dalvik虛擬機實例,就會消耗大量的內(nèi)存以及時間。因此,為了克服這個問題,Android系統(tǒng)創(chuàng)造了”Zygote”。Zygote讓Dalvik虛擬機共享代碼、低內(nèi)存占用以及最小的啟動時間成為可能。Zygote是一個虛擬器進(jìn)程,正如我們在前一個步驟所說的在系統(tǒng)引導(dǎo)的時候啟動。Zygote預(yù)加載以及初始化核心庫類。通常,這些核心類一般是只讀的,也是Android SDK或者核心框架的一部分。在Java虛擬機中,每一個實例都有它自己的核心庫類文件和堆對象的拷貝。
Zygote加載進(jìn)程
加載ZygoteInit類,源代碼:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
registerZygoteSocket()為zygote命令連接注冊一個服務(wù)器套接字。
preloadClassed “preloaded-classes”是一個簡單的包含一系列需要預(yù)加載類的文本文件,你可以在/frameworks/base找到“preloaded-classes”文件。
preloadResources() preloadResources也意味著本地主題、布局以及android.R文件中包含的所有東西都會用這個方法加載。
在這個階段,你可以看到啟動動畫。
第六步:系統(tǒng)服務(wù)或服務(wù)
完成了上面幾步之后,運行環(huán)境請求Zygote運行系統(tǒng)服務(wù)。系統(tǒng)服務(wù)同時使用native以及java編寫,系統(tǒng)服務(wù)可以認(rèn)為是一個進(jìn)程。同一個系統(tǒng)服務(wù)在Android SDK可以以System Services形式獲得。系統(tǒng)服務(wù)包含了所有的System Services。
Zygote創(chuàng)建新的進(jìn)程去啟動系統(tǒng)服務(wù)。你可以在ZygoteInit類的”startSystemServer”方法中找到源代碼。
核心服務(wù):
啟動電源管理器;
創(chuàng)建Activity管理器;
啟動電話注冊;
啟動包管理器;
設(shè)置Activity管理服務(wù)為系統(tǒng)進(jìn)程;
啟動上下文管理器;
啟動系統(tǒng)Context Providers;
啟動電池服務(wù);
啟動定時管理器;
啟動傳感服務(wù);
啟動窗口管理器;
啟動藍(lán)牙服務(wù);
啟動掛載服務(wù)。
其他服務(wù):
啟動狀態(tài)欄服務(wù);
啟動硬件服務(wù);
啟動網(wǎng)絡(luò)狀態(tài)服務(wù);
啟動網(wǎng)絡(luò)連接服務(wù);
啟動通知管理器;
啟動設(shè)備存儲監(jiān)視服務(wù);
啟動定位管理器;
啟動搜索服務(wù);
啟動剪切板服務(wù);
啟動登記服務(wù);
啟動壁紙服務(wù);
啟動音頻服務(wù);
啟動耳機監(jiān)聽;
啟動AdbSettingsObserver(處理adb命令)。
第七步:引導(dǎo)完成
一旦系統(tǒng)服務(wù)在內(nèi)存中跑起來了,Android就完成了引導(dǎo)過程。在這個時候“ACTION_BOOT_COMPLETED”開機啟動廣播就會發(fā)出去。
AMS主要功能:
AMS是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作。還負(fù)責(zé)啟動或殺死應(yīng)用程序的進(jìn)程。
WMS主要功能:
為所有窗口分配Surface。
管理Surface的顯示順序、尺寸、位置。
管理窗口動畫。
輸入系統(tǒng)相關(guān):WMS是派發(fā)系統(tǒng)按鍵和觸摸消息的最佳人選,當(dāng)接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息。
PWS主要功能:
PMS 用來管理跟蹤所有應(yīng)用APK,包括安裝,卸載,解析,控制權(quán)限等。
SystemServer也是一個進(jìn)程,包括AMS、PMS、WMS等等。
zygote意為“受精卵“。Android是基于Linux系統(tǒng)的,而在Linux中,所有的進(jìn)程都是由init進(jìn)程直接或者是間接fork出來的,zygote進(jìn)程也不例外。
App進(jìn)程是用戶點擊桌面icon時,通過Launcher進(jìn)程請求SystemServer,再調(diào)用Zygote孵化的。
①點擊啟動一個App,Launcher進(jìn)程采用Binder IPC向ActivityManagerService發(fā)起startActivity請求;
②ActivityManagerService接收到請求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請求;
③Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程;
④App進(jìn)程通過Binder IPC向sytem_server進(jìn)程發(fā)起綁定Application請求;
⑤system_server進(jìn)程在收到請求后,進(jìn)行一系列準(zhǔn)備工作后,再通過binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請求;
⑥App進(jìn)程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message后,通過發(fā)射機制創(chuàng)建目標(biāo)Activity,并回調(diào)Activity.onCreate()等方法。
⑧到此,App便正式啟動,開始進(jìn)入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法,UI渲染結(jié)束后便可以看到App的主界面。
備注:
Launcher,PMS,Zygote,App進(jìn)程是三個獨立的進(jìn)程,相互通信就需要使用進(jìn)程間通信機制。與Zygote通信是使用的socket通信,Launcher,PMS,App進(jìn)程間使用的是Binder機制。
Android系統(tǒng)通過應(yīng)用程序自行在系統(tǒng)中登記注冊事件(即Intent)來響應(yīng)系統(tǒng)產(chǎn)生的各類消息。
例如Android實現(xiàn)系統(tǒng)開機自啟動程需要在Manifest中加入如下Intent-filter及權(quán)限Uses-permission即可。
intent-filter
action android:name="android.intent.action.BOOT_COMPLETED"/
(修改時候主要是去掉上面該行即可)
category android:name="android.intent.category.HOME" /
/intent-filter
uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/
(修改時候主要是去掉上面該行即可) Android系統(tǒng)為應(yīng)用程序管理功能提供了大量的API,可以通過API控制Intent和permission,其中
上述配置表示應(yīng)用程序會響應(yīng)系統(tǒng)產(chǎn)生的android.intent.action.BOOT_COMPLETED(系統(tǒng)啟動完成)信號,以此來實現(xiàn)應(yīng)用程序自啟動。當(dāng)然知道上述原理后,我們就可以隨心所欲的控制程序開機自啟動了。具體思路如下:
一、手工方法
基于上述原理,我們可以通過對系統(tǒng)中已安裝的程序去除其Manifest的上述配置片段來控制應(yīng)用程序的對系統(tǒng)的響應(yīng),當(dāng)然沒源碼可修改編譯的情況下只能實現(xiàn)屏蔽其對有些信號的響應(yīng),例如屏蔽該程序不再開機自啟動。手工方法就是利用有關(guān)工具直接在解壓其APK包后,修改其Manifest的上述配置行后再打包成APK,最后安裝到系統(tǒng)中就實現(xiàn)了屏蔽其自啟動功能。具體相關(guān)的工具軟件主要有APKTOOL。(請自己放狗去搜索下載)
二、編程實現(xiàn)
當(dāng)然手工方法需要借助APKTOOL等工具,步驟比較法繁瑣,我們可以通過自己開發(fā)來實現(xiàn)該功能。幸好
1、PackageManager
本類API是對所有基于加載信息的數(shù)據(jù)結(jié)構(gòu)的封裝,包括以下功能:
·安裝,卸載應(yīng)用
·查詢permission相關(guān)信息
·查詢Application相關(guān)信息(application,activity,receiver,service,provider及相應(yīng)屬性等)
·查詢已安裝應(yīng)用
·增加,刪除permission
·清除用戶數(shù)據(jù)、緩存,代碼段等
非查詢相關(guān)的API需要特定的權(quán)限,具體的API請參考SDK文檔。
2、ActivityManager相關(guān)
本類API是對運行時管理功能和運行時數(shù)據(jù)結(jié)構(gòu)的封裝,包括以下功能
·激活/去激活activity
·注冊/取消注冊動態(tài)接受intent
·發(fā)送/取消發(fā)送intent
·activity生命周期管理(暫停,恢復(fù),停止,銷毀等)
·activity task管理(前臺-后臺,后臺-前臺,最近task查詢,運行時task查詢)
·激活/去激活service
·激活/去激活provider等
task管理相關(guān)API需要特定的權(quán)限,具體API可參考SDK文檔。
前段時間在做智能機器人等定制android系統(tǒng)開發(fā)的應(yīng)用,因為機器人定制應(yīng)用,需要在系統(tǒng)啟動的時候就運行程序,不需要展示系統(tǒng)桌面,這里需要用到系統(tǒng)開機應(yīng)用自啟動,也就是常說的開機自啟動。
記錄一下實現(xiàn)流程:
在AndroidManifest.xml文件中配置監(jiān)聽啟動權(quán)限
新建一個監(jiān)聽廣播接收者BootReceiver
安裝app到手機上,然后啟動一次程序(據(jù)說安卓4.0以后,必須先啟動一次程序才能接收到開機完成的廣播,目的是防止惡意程序)
如果按照上面的全部步驟后操作后,重啟沒有自動啟動程序,怎么辦呢?是怎么回事呢?
如果還是失敗,那么請檢查你的手機是不是設(shè)置了app安裝首選位置是sd卡,據(jù)說安裝到sd卡的話,因為手機啟動成功后(發(fā)送了啟動完成的廣播后)才加載sd卡,所以app接收不到廣播。如果是的話,把app安裝到內(nèi)部存儲試試。如果不懂得設(shè)置的話,那么直接在AndroidManifest.xml文件中設(shè)置安裝路徑,在manifest的根節(jié)點中加入 android:installLocation="internalOnly" 。如下:
文章名稱:android程序啟動,Android 啟動
鏈接URL:http://chinadenli.net/article31/dsieipd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App開發(fā)、用戶體驗、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)