最近回顧的一些知識(shí),補(bǔ)充了一下。
西區(qū)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
源碼標(biāo)準(zhǔn):API : 29「Android 10.0」
android手機(jī)是怎么開(kāi)機(jī)的?
android 的底層是 linux kernel「 內(nèi)核 」,由 BootLoader「系統(tǒng)啟動(dòng)加載器」 負(fù)責(zé)加載(類似于計(jì)算機(jī)的BIOS系統(tǒng))。
首先啟動(dòng) init「父進(jìn)程,第一個(gè)進(jìn)程」進(jìn)程,接著運(yùn)行init.rc腳本,腳本文件有個(gè)命令啟動(dòng)了Zygote進(jìn)程,初始化時(shí)會(huì)啟動(dòng)虛擬機(jī)。
Zygote進(jìn)程fork出 SystemServer 進(jìn)程,然后會(huì)調(diào)用SystemServer.main()方法。
run方法中,主要是在進(jìn)程中啟動(dòng)系統(tǒng)的各項(xiàng)服務(wù),比如ActivityManagerService,PackageManagerService,WindowManagerService服務(wù)等。
下面是一些 主要 的初始化方法。
真正啟動(dòng)是在ActivityManagerService的中systemReady方法,調(diào)用resumeTopActivityLocked打開(kāi) 鎖屏界面 。
到這里,android的開(kāi)機(jī)流程結(jié)束。
第一種: 監(jiān)控RECEIVE_BOOT_COMPLETED,即開(kāi)機(jī)啟動(dòng)事件
第二種: 監(jiān)控sd卡mount事件, 監(jiān)控sd卡事件也有類似開(kāi)機(jī)啟動(dòng)效果。特別app安裝在sd卡的情況下有些os是抓取不到RECEIVE_BOOT_COMPLETED
第三種: android:installLocation="internalOnly", 限制app的安裝位置,使其能抓取到RECEIVE_BOOT_COMPLETED
第四種: 監(jiān)聽(tīng)電話或者短信事件。
article class="_2rhmJa"
Android 設(shè)備開(kāi)機(jī)自啟動(dòng)的可以用廣播實(shí)現(xiàn),因?yàn)?Android 設(shè)備開(kāi)機(jī)時(shí)會(huì)發(fā)送一條開(kāi)機(jī)廣播 "android.intent.action.BOOT_COMPLETED"。接收后實(shí)現(xiàn)啟動(dòng)就完成了。
接下來(lái)是準(zhǔn)備工作
如果按照上面的全部步驟后操作后,重啟沒(méi)有自動(dòng)啟動(dòng)程序,怎么辦呢?是怎么回事呢?
*那么首先請(qǐng)檢查一下你的手機(jī)是不是安裝了360等安全助手之類的軟件,如果有,請(qǐng)?jiān)谲浖淖詥?dòng)軟件管理中將app設(shè)置為允許
*我的手機(jī)沒(méi)有安裝這些軟件,但是手機(jī)中自帶了安全助手,有的手機(jī)系統(tǒng)設(shè)置里面自帶了自啟動(dòng)軟件管理的功能 ,所以在這里將我們的app設(shè)置為允許開(kāi)機(jī)啟動(dòng)),重啟手機(jī),測(cè)試是否成功。
然而并沒(méi)有成功
接收不到BOOT_COMPLETED廣播可能的原因
(1)、BOOT_COMPLETED對(duì)應(yīng)的action和uses-permission沒(méi)有一起添加
(2)、應(yīng)用安裝到了sd卡內(nèi),安裝在sd卡內(nèi)的應(yīng)用是收不到BOOT_COMPLETED廣播的
(3)、系統(tǒng)開(kāi)啟了Fast Boot模式,這種模式下系統(tǒng)啟動(dòng)并不會(huì)發(fā)送BOOT_COMPLETED廣播
(4)、應(yīng)用程序安裝后重來(lái)沒(méi)有啟動(dòng)過(guò),這種情況下應(yīng)用程序接收不到任何廣播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之后,系統(tǒng)為了加強(qiáng)了安全性控制,應(yīng)用程序安裝后或是(設(shè)置)應(yīng)用管理中被強(qiáng)制關(guān)閉后處于stopped狀態(tài),在這種狀態(tài)下接收不到任何廣播,除非廣播帶有FLAG_INCLUDE_STOPPED_PACKAGES標(biāo)志,而默認(rèn)所有系統(tǒng)廣播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就沒(méi)法通過(guò)系統(tǒng)廣播自啟動(dòng)了。所以Android3.1之后
(1)、應(yīng)用程序無(wú)法在安裝后自己?jiǎn)?dòng)
(2)、沒(méi)有ui的程序必須通過(guò)其他應(yīng)用激活才能啟動(dòng),如它的Activity、Service、Content Provider被其他應(yīng)用調(diào)用。
存在一種例外,就是應(yīng)用程序被adb push you.apk /system/app/下是會(huì)自動(dòng)啟動(dòng)的,不處于stopped狀態(tài)。
并不太懂 我的APP啟動(dòng)后 已經(jīng)收到廣播
第一種方式 我再模擬器上 測(cè)試 可以 android 9.0版本
桌面設(shè)置也會(huì)把你的app當(dāng)成一個(gè)桌面主題,還有一個(gè)選項(xiàng)是系統(tǒng)桌面,你需要設(shè)置成自己的app
如果找不到桌面設(shè)置選項(xiàng),可以從手機(jī)設(shè)置–應(yīng)用程序-查看所有應(yīng)用程序(包括系統(tǒng)的應(yīng)用程序),找到桌面程序之類的字眼的應(yīng)用,清楚其默認(rèn)設(shè)置。