




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
\o"Android應(yīng)用程序Activity啟動(dòng)過(guò)程簡(jiǎn)要簡(jiǎn)介和學(xué)習(xí)籌劃"Android應(yīng)用程序Activity啟動(dòng)過(guò)程簡(jiǎn)要簡(jiǎn)介和學(xué)習(xí)籌劃分類:Android-08-1415:461047人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)
在Android系統(tǒng)中,Activity和Service是應(yīng)用程序核心組件,它們以松藕合方式組合在一起構(gòu)成了一種完整應(yīng)用程序,這得益于應(yīng)用程序框架層提供了一套完整機(jī)制來(lái)協(xié)助應(yīng)用程序啟動(dòng)這些Activity和Service,以及提供Binder機(jī)制協(xié)助它們互相間進(jìn)行通信。在前面文章Android進(jìn)程間通信(IPC)機(jī)制Binder簡(jiǎn)要簡(jiǎn)介和學(xué)習(xí)籌劃和Android系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過(guò)程(startService)原理分析中,咱們已經(jīng)系統(tǒng)地簡(jiǎn)介了Binder機(jī)制和Service啟動(dòng)過(guò)程了,在本文中,簡(jiǎn)要簡(jiǎn)介Activity啟動(dòng)過(guò)程以及后續(xù)學(xué)習(xí)籌劃。
在Android系統(tǒng)中,有兩種操作會(huì)引起Activity啟動(dòng),一種顧客點(diǎn)擊應(yīng)用程序圖標(biāo)時(shí),Launcher會(huì)為咱們啟動(dòng)應(yīng)用程序主Activity;應(yīng)用程序默認(rèn)Activity啟動(dòng)起來(lái)后,它又可以在內(nèi)部通過(guò)調(diào)用startActvity接口啟動(dòng)新Activity,依此類推,每一種Activity都可以在內(nèi)部啟動(dòng)新Activity。通過(guò)這種連鎖反映,按需啟動(dòng)Activity,從而完畢應(yīng)用程序功能。
這里,咱們通過(guò)一種詳細(xì)例子來(lái)闡明如何啟動(dòng)Android應(yīng)用程序Activity。Activity啟動(dòng)方式有兩種,一種是顯式,一種是隱式,隱式啟動(dòng)可以使得Activity之間藕合性更加松散,因而,這里只關(guān)注隱式啟動(dòng)Activity辦法。
一方面在Android源代碼工程packages/experimental目錄下創(chuàng)立一種應(yīng)用程序工程目錄Activity。關(guān)于如何獲得Android源代碼工程,請(qǐng)參照在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關(guān)于如何在Android源代碼工程中創(chuàng)立應(yīng)用程序工程,請(qǐng)參照在Ubuntu上為Android系統(tǒng)內(nèi)置Java應(yīng)用程序測(cè)試ApplicationFrameworks層硬件服務(wù)一文。這里,工程名稱就是Activity了,它定義了一種途徑為shy.luo.activitypackage,這個(gè)例子源代碼重要就是實(shí)當(dāng)前這里了。下面,將會(huì)逐個(gè)簡(jiǎn)介這個(gè)package里面文獻(xiàn)。
應(yīng)用程序默認(rèn)Activity定義在src/shy/luo/activity/MainActivity.java文獻(xiàn)中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?package
shy.luo.activity;
import
shy.luo.activity.R;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
public
class
MainActivity
extends
Activity
implements
OnClickListener
{
private
final
static
String
LOG_TAG
=
"shy.luo.activity.MainActivity";
private
Button
startButton
=
null;
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton
=
(Button)findViewById(R.id.button_start);
startButton.setOnClickListener(this);
Log.i(LOG_TAG,
"Main
Activity
Created.");
}
@Override
public
void
onClick(View
v)
{
if(v.equals(startButton))
{
Intent
intent
=
new
Intent("shy.luo.activity.subactivity");
startActivity(intent);
}
}
}
它實(shí)現(xiàn)很簡(jiǎn)樸,當(dāng)點(diǎn)擊它上面一種按鈕時(shí)候,就會(huì)啟動(dòng)此外一種名字為“shy.luo.activity.subactivity”Actvity。
名字為“shy.luo.activity.subactivity”Actvity實(shí)當(dāng)前src/shy/luo/activity/SubActivity.java文獻(xiàn)中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?package
shy.luo.activity;
import
android.app.Activity;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
public
class
SubActivity
extends
Activity
implements
OnClickListener
{
private
final
static
String
LOG_TAG
=
"shy.luo.activity.SubActivity";
private
Button
finishButton
=
null;
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
finishButton
=
(Button)findViewById(R.id.button_finish);
finishButton.setOnClickListener(this);
Log.i(LOG_TAG,
"Sub
Activity
Created.");
}
@Override
public
void
onClick(View
v)
{
if(v.equals(finishButton))
{
finish();
}
}
}
它實(shí)現(xiàn)也很簡(jiǎn)樸,當(dāng)點(diǎn)擊上面一種銨鈕時(shí)候,就結(jié)束自己,回到前面一種Activity中去。
這里咱們可以看到,Android應(yīng)用程序架構(gòu)中非常核心一點(diǎn):MainActivity不需要懂得SubActivity存在,即它不直接擁有SubActivity接口,但是它可以通過(guò)一種字符串來(lái)告訴應(yīng)用程序框架層,它要啟動(dòng)Activity名稱是什么,其他事情就交給應(yīng)用程序框架層來(lái)做,固然,應(yīng)用程序框架層會(huì)依照這個(gè)字符串來(lái)找到其相應(yīng)Activity,然后把它啟動(dòng)起來(lái)。這樣,就使得Android應(yīng)用程序中Activity藕合性很松散,從而使得Android應(yīng)用程序模塊性限度很高,并且有助于后來(lái)程序維護(hù)和更新,對(duì)于大型客戶端軟件來(lái)說(shuō),這一點(diǎn)是非常重要。
固然,應(yīng)用程序框架可以依照名字來(lái)找到相應(yīng)Activity,是需要應(yīng)用程序自身來(lái)配合,這就是要通過(guò)應(yīng)用程序配備文獻(xiàn)AndroidManifest.xml來(lái)實(shí)現(xiàn)了:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<?xml
version="1.0"
encoding="utf-8"?>
<manifest
xmlns:android=""
package="shy.luo.activity"
android:versionCode="1"
android:versionName="1.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="ent.action.MAIN"
/>
<category
android:name="ent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity
android:name=".SubActivity"
android:label="@string/sub_activity">
<intent-filter>
<action
android:name="shy.luo.activity.subactivity"/>
<category
android:name="ent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
從這個(gè)配備文獻(xiàn)中,咱們可以看到,MainActivity被配備成了應(yīng)用程序默認(rèn)Activity,即顧客在手機(jī)屏幕上點(diǎn)擊Activity應(yīng)用程序圖標(biāo)時(shí),Launcher就會(huì)默認(rèn)啟動(dòng)MainActivity這個(gè)Activity:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="ent.action.MAIN"
/>
<category
android:name="ent.category.LAUNCHER"
/>
</intent-filter>
</activity>
這個(gè)配備文獻(xiàn)也將名字“shy.luo.activity.subactivity”和SubActivity關(guān)聯(lián)了起來(lái),因而,應(yīng)用程序框架層可以依照名字來(lái)找到它:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<activity
android:name=".SubActivity"
android:label="@string/sub_activity">
<intent-filter>
<action
android:name="shy.luo.activity.subactivity"/>
<category
android:name="ent.category.DEFAULT"/>
</intent-filter>
</activity>
下面再列出這個(gè)應(yīng)用程序界面配備文獻(xiàn)和字符串文獻(xiàn)。
界面配備文獻(xiàn)在res/layout目錄中,main.xml文獻(xiàn)相應(yīng)MainActivity界面:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<Button
android:id="@+id/button_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/start"
>
</Button>
</LinearLayout>
而sub.xml相應(yīng)SubActivity界面:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<Button
android:id="@+id/button_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/finish"
>
</Button>
</LinearLayout>
字符串文獻(xiàn)位于res/values/strings.xml文獻(xiàn)中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?<?xml
version="1.0"
encoding="utf-8"?>
<resources>
<string
name="app_name">Activity</string>
<string
name="sub_activity">Sub
Activity</string>
<string
name="start">Start
sub-activity</string>
<string
name="finish">Finish
activity</string>
</resources>
最后,咱們還要在工程目錄下放置一種編譯腳本文獻(xiàn)Android.mk:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?LOCAL_PATH:=
$(call
my-dir)
include
$(CLEAR_VARS)
LOCAL_MODULE_TAGS
:=
optional
LOCAL_SRC_FILES
:=
$(call
all-subdir-java-files)
LOCAL_PACKAGE_NAME
:=
Activity
include
$(BUILD_PACKAGE)
這樣,整個(gè)例子源代碼實(shí)現(xiàn)就簡(jiǎn)介完了,接下來(lái)就要編譯了。關(guān)于如何單獨(dú)編譯Android源代碼工程模塊,以及如何打包system.img,請(qǐng)參照如何單獨(dú)編譯Android源代碼中模塊一文。
執(zhí)行如下命令進(jìn)行編譯和打包:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?USER-NAME@MACHINE-NAME:~/Android$
mmm
packages/experimental/Activity
USER-NAME@MACHINE-NAME:~/Android$
make
snod
這樣,打包好Android系統(tǒng)鏡像文獻(xiàn)system.img就包括咱們前面創(chuàng)立Activity應(yīng)用程序了。
再接下來(lái),就是運(yùn)營(yíng)模仿器來(lái)運(yùn)營(yíng)咱們例子了。關(guān)于如何在Android源代碼工程中運(yùn)營(yíng)模仿器,請(qǐng)參照在Ubuntu上下載、編譯和安裝Android最新源代碼一文。
執(zhí)行如下命令啟動(dòng)模仿器:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?USER-NAME@MACHINE-NAME:~/Android$
emulator
模仿器啟動(dòng)起,就可以在屏幕上看到Activity應(yīng)用程序圖標(biāo)了:
點(diǎn)擊Activity這個(gè)應(yīng)用程序圖標(biāo)后,Launcher就會(huì)把MainActivity啟動(dòng)起來(lái):
點(diǎn)擊上面Startsub-activity銨鈕,MainActivity內(nèi)部就會(huì)通過(guò)startActivity接口來(lái)啟動(dòng)SubActivity:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?Intent
intent
=
new
Intent("shy.luo.activity.subactivity");
startActivity(intent);
如下圖所示:
無(wú)論是通過(guò)點(diǎn)擊應(yīng)用程序圖標(biāo)來(lái)啟動(dòng)Activity,還是通過(guò)Activity內(nèi)部調(diào)用startActivity接口來(lái)啟動(dòng)新Activity,都要借助于應(yīng)用程序框架層ActivityManagerService服務(wù)進(jìn)程。在前面一篇文章Android系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過(guò)程(startService)原理分析中,咱們已經(jīng)看到,Service也是由ActivityManagerService進(jìn)程來(lái)啟動(dòng)。在Android應(yīng)用程序框架層中,ActivityManagerService是一種非常重要接口,它不但負(fù)責(zé)啟動(dòng)Activity和Service,還負(fù)責(zé)管理Activity和Service。
Android應(yīng)用程序框架層中ActivityManagerService啟動(dòng)Activity過(guò)程大體如下圖所示:
在這個(gè)圖中,ActivityManagerService和ActivityStack位于同一種進(jìn)程中,而ApplicationThread和ActivityThread位于另一種進(jìn)程中。其中,ActivityManagerService是負(fù)責(zé)管理Activity生命周期,ActivityManagerService還借助ActivityStack是來(lái)把所有Activity按照后進(jìn)先出順序放在一種堆棧中;對(duì)于每一種應(yīng)用程序來(lái)說(shuō),均有一種ActivityThread來(lái)表達(dá)應(yīng)用程序主進(jìn)程,而每一種ActivityThread都包具有一種ApplicationThread實(shí)例,它是一種Binder對(duì)象,負(fù)責(zé)和其他進(jìn)程進(jìn)行通信。
下面簡(jiǎn)要簡(jiǎn)介一下啟動(dòng)過(guò)程:
Step1.
無(wú)論是通過(guò)Launcher來(lái)啟動(dòng)Activity,還是通過(guò)Activity內(nèi)部調(diào)用startActivity接口來(lái)啟動(dòng)新Activity,都通過(guò)Binder進(jìn)程間通信進(jìn)入到ActivityManagerService進(jìn)程中,并且調(diào)用ActivityManagerService.sta
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字創(chuàng)意產(chǎn)業(yè)的投資風(fēng)險(xiǎn)評(píng)估考核試卷
- 內(nèi)退合同標(biāo)準(zhǔn)文本
- 單板加工環(huán)境保護(hù)與資源綜合利用考核試卷
- 不寫期限合同標(biāo)準(zhǔn)文本
- 入戶維修家電合同標(biāo)準(zhǔn)文本
- 親子贈(zèng)予汽車合同標(biāo)準(zhǔn)文本
- 農(nóng)村改革合同范例
- 共同投資買車合同標(biāo)準(zhǔn)文本
- 中鐵建工供應(yīng)合同標(biāo)準(zhǔn)文本
- epco模式合同標(biāo)準(zhǔn)文本
- 2025年安徽衛(wèi)生健康職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- 2025上海崇明現(xiàn)代農(nóng)業(yè)園區(qū)開(kāi)發(fā)限公司招聘39人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 神經(jīng)內(nèi)科一科一品護(hù)理亮點(diǎn)
- Unit 5 Here and Now Section A1a~1d教學(xué)設(shè)計(jì) -2024-2025學(xué)年人教版(2024)七年級(jí)英語(yǔ)下冊(cè)
- 3級(jí)高空作業(yè)施工方案
- 授受動(dòng)詞基礎(chǔ)知識(shí)點(diǎn)講解課件 高三日語(yǔ)一輪復(fù)習(xí)
- 老年肺炎臨床診斷與治療專家共識(shí)(2024年版)解讀
- 護(hù)理隨訪案例分享課件
- 天然產(chǎn)物藥物生物合成
- 國(guó)網(wǎng)十八項(xiàng)反措(修訂版)宣貫
- 安徽省合肥市廬陽(yáng)區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測(cè)英語(yǔ)試題(無(wú)答案)
評(píng)論
0/150
提交評(píng)論