真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android程序啟動(dòng),Android 啟動(dòng)

Android App 開機(jī)自啟動(dòng)

article class="_2rhmJa"

成都創(chuàng)新互聯(lián)公司專注于原陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供原陽營銷型網(wǎng)站建設(shè),原陽網(wǎng)站制作、原陽網(wǎng)頁設(shè)計(jì)、原陽網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造原陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供原陽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

Android 設(shè)備開機(jī)自啟動(dòng)的可以用廣播實(shí)現(xiàn),因?yàn)?Android 設(shè)備開機(jī)時(shí)會(huì)發(fā)送一條開機(jī)廣播 "android.intent.action.BOOT_COMPLETED"。接收后實(shí)現(xiàn)啟動(dòng)就完成了。

接下來是準(zhǔn)備工作

如果按照上面的全部步驟后操作后,重啟沒有自動(dòng)啟動(dòng)程序,怎么辦呢?是怎么回事呢?

*那么首先請(qǐng)檢查一下你的手機(jī)是不是安裝了360等安全助手之類的軟件,如果有,請(qǐng)?jiān)谲浖淖詥?dòng)軟件管理中將app設(shè)置為允許

*我的手機(jī)沒有安裝這些軟件,但是手機(jī)中自帶了安全助手,有的手機(jī)系統(tǒng)設(shè)置里面自帶了自啟動(dòng)軟件管理的功能 ,所以在這里將我們的app設(shè)置為允許開機(jī)啟動(dòng)),重啟手機(jī),測(cè)試是否成功。

然而并沒有成功

接收不到BOOT_COMPLETED廣播可能的原因

(1)、BOOT_COMPLETED對(duì)應(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)啟動(dòng)并不會(huì)發(fā)送BOOT_COMPLETED廣播

(4)、應(yīng)用程序安裝后重來沒有啟動(dòng)過,這種情況下應(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的,所以就沒法通過系統(tǒng)廣播自啟動(dòng)了。所以Android3.1之后

(1)、應(yīng)用程序無法在安裝后自己啟動(dòng)

(2)、沒有ui的程序必須通過其他應(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è)置。

安卓應(yīng)用啟動(dòng)詳解:從Zygote到你的Activity.onCreate()

翻譯自:

這篇文章講解當(dāng)用戶點(diǎn)擊應(yīng)用圖標(biāo)時(shí),安卓如何啟動(dòng)你的應(yīng)用。安卓系統(tǒng)做了很多幕后工作,來使得你的launch activity對(duì)用戶可見。本文通過重要階段的講解和調(diào)用序列詳細(xì)講解這一過程。

安卓應(yīng)用在這兩個(gè)方面是獨(dú)特的:

多個(gè)入口點(diǎn) :Android應(yīng)用程序由不同的組件組成,它們可以調(diào)用其他應(yīng)用程序擁有的組件。這些組件大致對(duì)應(yīng)于任何應(yīng)用程序的多個(gè)入口點(diǎn)。因此,它們不同于具有像main()方法那樣的單個(gè)入口點(diǎn)的傳統(tǒng)應(yīng)用程序。

擁有自己的小世界 :每個(gè)Android應(yīng)用程序都生活在自己的世界中,它在單獨(dú)的進(jìn)程中運(yùn)行,擁有自己的Dalvik VM實(shí)例,并分配有唯一的用戶ID。

必要時(shí)會(huì)啟動(dòng)Android進(jìn)程。

每當(dāng)用戶或其他系統(tǒng)組件請(qǐng)求執(zhí)行屬于您應(yīng)用程序的組件(可能是服務(wù),活動(dòng)或意圖接收器)時(shí),Android系統(tǒng)都會(huì)為您的應(yīng)用程序啟動(dòng)一個(gè)新進(jìn)程(如果尚未運(yùn)行)。通常,進(jìn)程一直運(yùn)行直到被系統(tǒng)殺死。應(yīng)用程序流程是按需創(chuàng)建的,在您看到應(yīng)用程序的啟動(dòng)活動(dòng)啟動(dòng)并運(yùn)行之前,發(fā)生了許多事情。

每個(gè)應(yīng)用程序都在其自己的進(jìn)程中運(yùn)行 :默認(rèn)情況下,每個(gè)Android應(yīng)用程序都在其自己的Android進(jìn)程中運(yùn)行,而這個(gè)進(jìn)程只不過是一個(gè)Linux進(jìn)程,而該進(jìn)程首先需要一個(gè)執(zhí)行線程。例如,當(dāng)您單擊電子郵件中的超鏈接時(shí),網(wǎng)頁將在瀏覽器窗口中打開。您的郵件客戶端和瀏覽器是兩個(gè)單獨(dú)的應(yīng)用程序,它們分別在兩個(gè)單獨(dú)的進(jìn)程中運(yùn)行。click事件使Android平臺(tái)啟動(dòng)新進(jìn)程,以便它可以在其自身進(jìn)程的上下文中實(shí)例化瀏覽器活動(dòng)。這對(duì)于應(yīng)用程序中的任何其他組件同樣適用。

讓我們退后一會(huì)兒,快速瀏覽一下系統(tǒng)啟動(dòng)過程。與大多數(shù)基于Linux的系統(tǒng)一樣,啟動(dòng)加載程序在啟動(dòng)時(shí)將加載內(nèi)核并啟動(dòng)init進(jìn)程。然后,init會(huì)生成稱為“守護(hù)程序”的低級(jí)Linux進(jìn)程,例如android debug守護(hù)程序,USB守護(hù)程序等。這些守護(hù)程序通常處理低級(jí)硬件接口,包括無線電接口。

然后,初始化過程會(huì)啟動(dòng)一個(gè)非常有趣的過程,稱為“zygote'。

顧名思義,這是其余Android應(yīng)用程序的開始。這是初始化Dalvik虛擬機(jī)的第一個(gè)實(shí)例的過程。它還預(yù)加載Android應(yīng)用程序框架和系統(tǒng)上安裝的各種應(yīng)用程序使用的所有常見類。因此,它準(zhǔn)備進(jìn)行復(fù)制。它統(tǒng)計(jì)偵聽套接字接口上的將來請(qǐng)求,以產(chǎn)生新的虛擬機(jī)(VM)來管理新的應(yīng)用程序進(jìn)程。收到新請(qǐng)求后,它會(huì)分叉以創(chuàng)建一個(gè)新進(jìn)程,該進(jìn)程將獲取預(yù)先初始化的VM實(shí)例。

zygote之后,init啟動(dòng)運(yùn)行時(shí)過程。

然后zygote分叉以啟動(dòng)一個(gè)名為System server的托管良好的進(jìn)程。系統(tǒng)服務(wù)器在其自己的上下文中啟動(dòng)所有核心平臺(tái)服務(wù),例如活動(dòng)管理器服務(wù)和硬件服務(wù)。

此時(shí),完整的堆棧已準(zhǔn)備就緒,可以啟動(dòng)第一個(gè)應(yīng)用程序流程-主頁應(yīng)用程序,該應(yīng)用程序顯示主屏幕(也稱為啟動(dòng)器應(yīng)用程序)。

click事件被轉(zhuǎn)換為 startActivity(intent), 并通過Binder IPC路由到 ActivityManagerService 。ActvityManagerService執(zhí)行多個(gè)步驟

如您所見,當(dāng)用戶單擊圖標(biāo)并啟動(dòng)新應(yīng)用程序時(shí),許多事情發(fā)生在幕后。這是全圖:

流程創(chuàng)建:

ActivityManagerService 通過調(diào)用 startProcessLocked() 方法創(chuàng)建一個(gè)新進(jìn)程,該方法通過套接字連接將參數(shù)發(fā)送到Zygote進(jìn)程。Zygote派生自己并調(diào)用 ZygoteInit.main() ,然后實(shí)例化 ActivityThread 對(duì)象并返回新創(chuàng)建的進(jìn)程的進(jìn)程ID。

默認(rèn)情況下,每個(gè)進(jìn)程都有一個(gè)線程。主線程有一個(gè) Looper 實(shí)例來處理來自消息隊(duì)列的消息,并且它在 run() 方法的每次迭代中都調(diào)用 Looper.loop() 。 Looper 的工作是從消息隊(duì)列中彈出消息并調(diào)用相應(yīng)的方法來處理它們。然后,ActivityThread通過隨后調(diào)用 Looper.prepareLoop() 和 Looper.loop()來 啟動(dòng)消息循環(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)用啟動(dòng):單擊事件以執(zhí)行Looper調(diào)用順序/figcaption

應(yīng)用程序綁定:

下一步是將此新創(chuàng)建的過程附加到特定應(yīng)用程序。這是通過在線程對(duì)象上調(diào)用 bindApplication() 來完成的。此方法將 BIND_APPLICATION 消息發(fā)送到消息隊(duì)列。該消息由 Handler 對(duì)象檢索,該對(duì)象隨后調(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)用啟動(dòng):BIND_APPLICATION消息處理/figcaption

啟動(dòng)活動(dòng):

在上一步之后,系統(tǒng)包含負(fù)責(zé)應(yīng)用程序的進(jìn)程,并將應(yīng)用程序類加載到進(jìn)程的私有內(nèi)存中。在新創(chuàng)建的流程和現(xiàn)有流程之間,啟動(dòng)活動(dòng)的調(diào)用順序很常見。

實(shí)際的啟動(dòng)過程從 realStartActivity() 方法開始, 該 方法在應(yīng)用程序線程對(duì)象上調(diào)用 sheduleLaunchActivity() 。此方法將 LAUNCH_ACTIVITY 消息發(fā)送到消息隊(duì)列。該消息由 handleLaunchActivity() 方法處理,如下所示。

假設(shè)用戶單擊“視頻瀏覽器”應(yīng)用程序。啟動(dòng)該活動(dò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)用啟動(dòng): LAUNCH_ACTIVITY消息處理 /figcaption

該活動(dòng)通過 onCreate() 方法調(diào)用開始其托管生命周期。該活動(dòng)通過 onRestart() 調(diào)用進(jìn)入前臺(tái),并通過 onStart() 調(diào)用開始與用戶進(jìn)行交互。

Android啟動(dòng)過程深入解析

當(dāng)按下Android設(shè)備電源鍵時(shí)究竟發(fā)生了什么?

Android的啟動(dòng)過程是怎么樣的?

什么是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啟動(dòng)過程時(shí),腦海中總是冒出很多疑問。本文將介紹Android的啟動(dòng)過程,希望能幫助你找到上面這些問題的答案。

Android是一個(gè)基于Linux的開源操作系統(tǒng)。x86(x86是一系列的基于intel 8086 CPU的計(jì)算機(jī)微處理器指令集架構(gòu))是linux內(nèi)核部署最常見的系統(tǒng)。然而,所有的Android設(shè)備都是運(yùn)行在ARM處理器(ARM 源自進(jìn)階精簡指令集機(jī)器,源自ARM架構(gòu))上,除了英特爾的Xolo設(shè)備()。Xolo來源自凌動(dòng)1.6GHz x86處理器。Android設(shè)備或者嵌入設(shè)備或者基于linux的ARM設(shè)備的啟動(dòng)過程與桌面版本相比稍微有些差別。這篇文章中,我將解釋Android設(shè)備的啟動(dòng)過程。深入linux啟動(dòng)過程是一篇講桌面linux啟動(dòng)過程的好文。

當(dāng)你按下電源開關(guān)后Android設(shè)備執(zhí)行了以下步驟。

此處圖片中step2中的一個(gè)單詞拼寫錯(cuò)了,Boot Loaeder應(yīng)該為Boot Loader(多謝@jameslast 提醒)

第一步:啟動(dòng)電源以及系統(tǒng)啟動(dòng)

當(dāng)電源按下,引導(dǎo)芯片代碼開始從預(yù)定義的地方(固化在ROM)開始執(zhí)行。加載引導(dǎo)程序到RAM,然后執(zhí)行。

第二步:引導(dǎo)程序

引導(dǎo)程序是在Android操作系統(tǒng)開始運(yùn)行前的一個(gè)小程序。引導(dǎo)程序是運(yùn)行的第一個(gè)程序,因此它是針對(duì)特定的主板與芯片的。設(shè)備制造商要么使用很受歡迎的引導(dǎo)程序比如redboot、uboot、qi bootloader或者開發(fā)自己的引導(dǎo)程序,它不是Android操作系統(tǒng)的一部分。引導(dǎo)程序是OEM廠商或者運(yùn)營商加鎖和限制的地方。

引導(dǎo)程序分兩個(gè)階段執(zhí)行。第一個(gè)階段,檢測(cè)外部的RAM以及加載對(duì)第二階段有用的程序;第二階段,引導(dǎo)程序設(shè)置網(wǎng)絡(luò)、內(nèi)存等等。這些對(duì)于運(yùn)行內(nèi)核是必要的,為了達(dá)到特殊的目標(biāo),引導(dǎo)程序可以根據(jù)配置參數(shù)或者輸入數(shù)據(jù)設(shè)置內(nèi)核。

Android引導(dǎo)程序可以在bootablebootloaderlegacyusbloader找到。

傳統(tǒng)的加載器包含的個(gè)文件,需要在這里說明:

init.s初始化堆棧,清零BBS段,調(diào)用main.c的_main()函數(shù);

main.c初始化硬件(鬧鐘、主板、鍵盤、控制臺(tái)),創(chuàng)建linux標(biāo)簽。

更多關(guān)于Android引導(dǎo)程序的可以在這里了解。

第三步:內(nèi)核

Android內(nèi)核與桌面linux內(nèi)核啟動(dòng)的方式差不多。內(nèi)核啟動(dòng)時(shí),設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表,加載驅(qū)動(dòng)。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件,然后啟動(dòng)root進(jìn)程或者系統(tǒng)的第一個(gè)進(jìn)程。

第四步:init進(jìn)程

init是第一個(gè)進(jìn)程,我們可以說它是root進(jìn)程或者說有進(jìn)程的父進(jìn)程。init進(jìn)程有兩個(gè)責(zé)任,一是掛載目錄,比如/sys、/dev、/proc,二是運(yùn)行init.rc腳本。

init進(jìn)程可以在/system/core/init找到。

init.rc文件可以在/system/core/rootdir/init.rc找到。

readme.txt可以在/system/core/init/readme.txt找到。

對(duì)于init.rc文件,Android中有特定的格式以及規(guī)則。在Android中,我們叫做Android初始化語言。

Action(動(dòng)作):動(dòng)作是以命令流程命名的,有一個(gè)觸發(fā)器決定動(dòng)作是否發(fā)生。

語法

1

2

3

4

5

; html-script: false ]

on trigger

command

command

command

Service(服務(wù)):服務(wù)是init進(jìn)程啟動(dòng)的程序、當(dāng)服務(wù)退出時(shí)init進(jìn)程會(huì)視情況重啟服務(wù)。

語法

1

2

3

4

5

; html-script: false ]

service name pathname [argument]*

option

option

...

Options(選項(xiàng))

選項(xiàng)是對(duì)服務(wù)的描述。它們影響init進(jìn)程如何以及何時(shí)啟動(dòng)服務(wù)。

咱們來看看默認(rèn)的init.rc文件。這里我只列出了主要的事件以及服務(wù)。

Table

Action/Service

描述

on early-init

設(shè)置init進(jìn)程以及它創(chuàng)建的子進(jìn)程的優(yōu)先級(jí),設(shè)置init進(jìn)程的安全環(huán)境

on init

設(shè)置全局環(huán)境,為cpu accounting創(chuàng)建cgroup(資源控制)掛載點(diǎn)

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

啟動(dòng)系統(tǒng)管理器管理所有的本地服務(wù),比如位置、音頻、Shared preference等等…

service zygote

啟動(dòng)zygote作為應(yīng)用進(jìn)程

在這個(gè)階段你可以在設(shè)備的屏幕上看到“Android”logo了。

第五步

在Java中,我們知道不同的虛擬機(jī)實(shí)例會(huì)為不同的應(yīng)用分配不同的內(nèi)存。假如Android應(yīng)用應(yīng)該盡可能快地啟動(dòng),但如果Android系統(tǒng)為每一個(gè)應(yīng)用啟動(dòng)不同的Dalvik虛擬機(jī)實(shí)例,就會(huì)消耗大量的內(nèi)存以及時(shí)間。因此,為了克服這個(gè)問題,Android系統(tǒng)創(chuàng)造了”Zygote”。Zygote讓Dalvik虛擬機(jī)共享代碼、低內(nèi)存占用以及最小的啟動(dòng)時(shí)間成為可能。Zygote是一個(gè)虛擬器進(jìn)程,正如我們?cè)谇耙粋€(gè)步驟所說的在系統(tǒng)引導(dǎo)的時(shí)候啟動(dòng)。Zygote預(yù)加載以及初始化核心庫類。通常,這些核心類一般是只讀的,也是Android SDK或者核心框架的一部分。在Java虛擬機(jī)中,每一個(gè)實(shí)例都有它自己的核心庫類文件和堆對(duì)象的拷貝。

Zygote加載進(jìn)程

加載ZygoteInit類,源代碼:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

registerZygoteSocket()為zygote命令連接注冊(cè)一個(gè)服務(wù)器套接字。

preloadClassed “preloaded-classes”是一個(gè)簡單的包含一系列需要預(yù)加載類的文本文件,你可以在/frameworks/base找到“preloaded-classes”文件。

preloadResources() preloadResources也意味著本地主題、布局以及android.R文件中包含的所有東西都會(huì)用這個(gè)方法加載。

在這個(gè)階段,你可以看到啟動(dòng)動(dòng)畫。

第六步:系統(tǒng)服務(wù)或服務(wù)

完成了上面幾步之后,運(yùn)行環(huán)境請(qǐng)求Zygote運(yùn)行系統(tǒng)服務(wù)。系統(tǒng)服務(wù)同時(shí)使用native以及java編寫,系統(tǒng)服務(wù)可以認(rèn)為是一個(gè)進(jìn)程。同一個(gè)系統(tǒng)服務(wù)在Android SDK可以以System Services形式獲得。系統(tǒng)服務(wù)包含了所有的System Services。

Zygote創(chuàng)建新的進(jìn)程去啟動(dòng)系統(tǒng)服務(wù)。你可以在ZygoteInit類的”startSystemServer”方法中找到源代碼。

核心服務(wù):

啟動(dòng)電源管理器;

創(chuàng)建Activity管理器;

啟動(dòng)電話注冊(cè);

啟動(dòng)包管理器;

設(shè)置Activity管理服務(wù)為系統(tǒng)進(jìn)程;

啟動(dòng)上下文管理器;

啟動(dòng)系統(tǒng)Context Providers;

啟動(dòng)電池服務(wù);

啟動(dòng)定時(shí)管理器;

啟動(dòng)傳感服務(wù);

啟動(dòng)窗口管理器;

啟動(dòng)藍(lán)牙服務(wù);

啟動(dòng)掛載服務(wù)。

其他服務(wù):

啟動(dòng)狀態(tài)欄服務(wù);

啟動(dòng)硬件服務(wù);

啟動(dòng)網(wǎng)絡(luò)狀態(tài)服務(wù);

啟動(dòng)網(wǎng)絡(luò)連接服務(wù);

啟動(dòng)通知管理器;

啟動(dòng)設(shè)備存儲(chǔ)監(jiān)視服務(wù);

啟動(dòng)定位管理器;

啟動(dòng)搜索服務(wù);

啟動(dòng)剪切板服務(wù);

啟動(dòng)登記服務(wù);

啟動(dòng)壁紙服務(wù);

啟動(dòng)音頻服務(wù);

啟動(dòng)耳機(jī)監(jiān)聽;

啟動(dòng)AdbSettingsObserver(處理adb命令)。

第七步:引導(dǎo)完成

一旦系統(tǒng)服務(wù)在內(nèi)存中跑起來了,Android就完成了引導(dǎo)過程。在這個(gè)時(shí)候“ACTION_BOOT_COMPLETED”開機(jī)啟動(dòng)廣播就會(huì)發(fā)出去。

Android應(yīng)用程序啟動(dòng)流程總結(jié)

AMS主要功能:

AMS是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作。還負(fù)責(zé)啟動(dòng)或殺死應(yīng)用程序的進(jìn)程。

WMS主要功能:

為所有窗口分配Surface。

管理Surface的顯示順序、尺寸、位置。

管理窗口動(dòng)畫。

輸入系統(tǒng)相關(guān):WMS是派發(fā)系統(tǒng)按鍵和觸摸消息的最佳人選,當(dāng)接收到一個(gè)觸摸事件,它需要尋找一個(gè)最合適的窗口來處理消息。

PWS主要功能:

PMS 用來管理跟蹤所有應(yīng)用APK,包括安裝,卸載,解析,控制權(quán)限等。

SystemServer也是一個(gè)進(jìn)程,包括AMS、PMS、WMS等等。

zygote意為“受精卵“。Android是基于Linux系統(tǒng)的,而在Linux中,所有的進(jìn)程都是由init進(jìn)程直接或者是間接fork出來的,zygote進(jìn)程也不例外。

App進(jìn)程是用戶點(diǎn)擊桌面icon時(shí),通過Launcher進(jìn)程請(qǐng)求SystemServer,再調(diào)用Zygote孵化的。

①點(diǎn)擊啟動(dòng)一個(gè)App,Launcher進(jìn)程采用Binder IPC向ActivityManagerService發(fā)起startActivity請(qǐng)求;

②ActivityManagerService接收到請(qǐng)求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求;

③Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程;

④App進(jìn)程通過Binder IPC向sytem_server進(jìn)程發(fā)起綁定Application請(qǐng)求;

⑤system_server進(jìn)程在收到請(qǐng)求后,進(jìn)行一系列準(zhǔn)備工作后,再通過binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請(qǐng)求;

⑥App進(jìn)程的binder線程(ApplicationThread)在收到請(qǐng)求后,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;

⑦主線程在收到Message后,通過發(fā)射機(jī)制創(chuàng)建目標(biāo)Activity,并回調(diào)Activity.onCreate()等方法。

⑧到此,App便正式啟動(dòng),開始進(jìn)入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法,UI渲染結(jié)束后便可以看到App的主界面。

備注:

Launcher,PMS,Zygote,App進(jìn)程是三個(gè)獨(dú)立的進(jìn)程,相互通信就需要使用進(jìn)程間通信機(jī)制。與Zygote通信是使用的socket通信,Launcher,PMS,App進(jìn)程間使用的是Binder機(jī)制。

android怎么設(shè)置開機(jī)啟動(dòng)軟件

Android系統(tǒng)通過應(yīng)用程序自行在系統(tǒng)中登記注冊(cè)事件(即Intent)來響應(yīng)系統(tǒng)產(chǎn)生的各類消息。

例如Android實(shí)現(xiàn)系統(tǒng)開機(jī)自啟動(dòng)程需要在Manifest中加入如下Intent-filter及權(quán)限Uses-permission即可。

intent-filter

action android:name="android.intent.action.BOOT_COMPLETED"/

(修改時(shí)候主要是去掉上面該行即可)

category android:name="android.intent.category.HOME" /

/intent-filter

uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/

(修改時(shí)候主要是去掉上面該行即可) Android系統(tǒng)為應(yīng)用程序管理功能提供了大量的API,可以通過API控制Intent和permission,其中

上述配置表示應(yīng)用程序會(huì)響應(yīng)系統(tǒng)產(chǎn)生的android.intent.action.BOOT_COMPLETED(系統(tǒng)啟動(dòng)完成)信號(hào),以此來實(shí)現(xiàn)應(yīng)用程序自啟動(dòng)。當(dāng)然知道上述原理后,我們就可以隨心所欲的控制程序開機(jī)自啟動(dòng)了。具體思路如下:

一、手工方法

基于上述原理,我們可以通過對(duì)系統(tǒng)中已安裝的程序去除其Manifest的上述配置片段來控制應(yīng)用程序的對(duì)系統(tǒng)的響應(yīng),當(dāng)然沒源碼可修改編譯的情況下只能實(shí)現(xiàn)屏蔽其對(duì)有些信號(hào)的響應(yīng),例如屏蔽該程序不再開機(jī)自啟動(dòng)。手工方法就是利用有關(guān)工具直接在解壓其APK包后,修改其Manifest的上述配置行后再打包成APK,最后安裝到系統(tǒng)中就實(shí)現(xiàn)了屏蔽其自啟動(dòng)功能。具體相關(guān)的工具軟件主要有APKTOOL。(請(qǐng)自己放狗去搜索下載)

二、編程實(shí)現(xiàn)

當(dāng)然手工方法需要借助APKTOOL等工具,步驟比較法繁瑣,我們可以通過自己開發(fā)來實(shí)現(xiàn)該功能。幸好

1、PackageManager

本類API是對(duì)所有基于加載信息的數(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請(qǐng)參考SDK文檔。

2、ActivityManager相關(guān)

本類API是對(duì)運(yùn)行時(shí)管理功能和運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)的封裝,包括以下功能

·激活/去激活activity

·注冊(cè)/取消注冊(cè)動(dòng)態(tài)接受intent

·發(fā)送/取消發(fā)送intent

·activity生命周期管理(暫停,恢復(fù),停止,銷毀等)

·activity task管理(前臺(tái)-后臺(tái),后臺(tái)-前臺(tái),最近task查詢,運(yùn)行時(shí)task查詢)

·激活/去激活service

·激活/去激活provider等

task管理相關(guān)API需要特定的權(quán)限,具體API可參考SDK文檔。

Android 設(shè)置開機(jī)自啟動(dòng)

前段時(shí)間在做智能機(jī)器人等定制android系統(tǒng)開發(fā)的應(yīng)用,因?yàn)闄C(jī)器人定制應(yīng)用,需要在系統(tǒng)啟動(dòng)的時(shí)候就運(yùn)行程序,不需要展示系統(tǒng)桌面,這里需要用到系統(tǒng)開機(jī)應(yīng)用自啟動(dòng),也就是常說的開機(jī)自啟動(dòng)。

記錄一下實(shí)現(xiàn)流程:

在AndroidManifest.xml文件中配置監(jiān)聽啟動(dòng)權(quán)限

新建一個(gè)監(jiān)聽廣播接收者BootReceiver

安裝app到手機(jī)上,然后啟動(dòng)一次程序(據(jù)說安卓4.0以后,必須先啟動(dòng)一次程序才能接收到開機(jī)完成的廣播,目的是防止惡意程序)

如果按照上面的全部步驟后操作后,重啟沒有自動(dòng)啟動(dòng)程序,怎么辦呢?是怎么回事呢?

如果還是失敗,那么請(qǐng)檢查你的手機(jī)是不是設(shè)置了app安裝首選位置是sd卡,據(jù)說安裝到sd卡的話,因?yàn)槭謾C(jī)啟動(dòng)成功后(發(fā)送了啟動(dòng)完成的廣播后)才加載sd卡,所以app接收不到廣播。如果是的話,把a(bǔ)pp安裝到內(nèi)部存儲(chǔ)試試。如果不懂得設(shè)置的話,那么直接在AndroidManifest.xml文件中設(shè)置安裝路徑,在manifest的根節(jié)點(diǎn)中加入 android:installLocation="internalOnly" 。如下:


分享標(biāo)題:android程序啟動(dòng),Android 啟動(dòng)
鏈接URL:http://weahome.cn/article/dsieipd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部