Android應(yīng)用程序的Activity啟動(dòng)過(guò)程簡(jiǎn)要介紹和學(xué)習(xí)專題計(jì)劃_第1頁(yè)
Android應(yīng)用程序的Activity啟動(dòng)過(guò)程簡(jiǎn)要介紹和學(xué)習(xí)專題計(jì)劃_第2頁(yè)
Android應(yīng)用程序的Activity啟動(dòng)過(guò)程簡(jiǎn)要介紹和學(xué)習(xí)專題計(jì)劃_第3頁(yè)
Android應(yīng)用程序的Activity啟動(dòng)過(guò)程簡(jiǎn)要介紹和學(xué)習(xí)專題計(jì)劃_第4頁(yè)
Android應(yīng)用程序的Activity啟動(dòng)過(guò)程簡(jiǎn)要介紹和學(xué)習(xí)專題計(jì)劃_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論