Android應用程序的Activity啟動過程簡要介紹和學習計劃_第1頁
Android應用程序的Activity啟動過程簡要介紹和學習計劃_第2頁
Android應用程序的Activity啟動過程簡要介紹和學習計劃_第3頁
Android應用程序的Activity啟動過程簡要介紹和學習計劃_第4頁
Android應用程序的Activity啟動過程簡要介紹和學習計劃_第5頁
免費預覽已結束,剩余11頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Android應用程序的Activity啟動過程簡要介紹和學習計劃Android應用程序的Activity啟動過程簡要介紹和學習計劃Android應用程序的Activity啟動過程簡要介紹和學習計劃xxx公司Android應用程序的Activity啟動過程簡要介紹和學習計劃文件編號:文件日期:修訂次數(shù):第1.0次更改批準審核制定方案設計,管理制度\o"Android應用程序的Activity啟動過程簡要介紹和學習計劃"Android應用程序的Activity啟動過程簡要介紹和學習計劃分類:Android2011-08-1415:461047人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

在Android系統(tǒng)中,Activity和Service是應用程序的核心組件,它們以松藕合的方式組合在一起構成了一個完整的應用程序,這得益于應用程序框架層提供了一套完整的機制來協(xié)助應用程序啟動這些Activity和Service,以及提供Binder機制幫助它們相互間進行通信。在前面的文章Android進程間通信(IPC)機制Binder簡要介紹和學習計劃和Android系統(tǒng)在新進程中啟動自定義服務過程(startService)的原理分析中,我們已經(jīng)系統(tǒng)地介紹了Binder機制和Service的啟動過程了,在本文中,簡要介紹Activity的啟動過程以及后續(xù)學習計劃。

在Android系統(tǒng)中,有兩種操作會引發(fā)Activity的啟動,一種用戶點擊應用程序圖標時,Launcher會為我們啟動應用程序的主Activity;應用程序的默認Activity啟動起來后,它又可以在內部通過調用startActvity接口啟動新的Activity,依此類推,每一個Activity都可以在內部啟動新的Activity。通過這種連鎖反應,按需啟動Activity,從而完成應用程序的功能。

這里,我們通過一個具體的例子來說明如何啟動Android應用程序的Activity。Activity的啟動方式有兩種,一種是顯式的,一種是隱式的,隱式啟動可以使得Activity之間的藕合性更加松散,因此,這里只關注隱式啟動Activity的方法。

首先在Android源代碼工程的packages/experimental目錄下創(chuàng)建一個應用程序工程目錄Activity。關于如何獲得Android源代碼工程,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關于如何在Android源代碼工程中創(chuàng)建應用程序工程,請參考在Ubuntu上為Android系統(tǒng)內置Java應用程序測試ApplicationFrameworks層的硬件服務一文。這里,工程名稱就是Activity了,它定義了一個路徑為的package,這個例子的源代碼主要就是實現(xiàn)在這里了。下面,將會逐一介紹這個package里面的文件。

應用程序的默認Activity定義在src/shy/luo/activity/文件中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""package

import

import

import

import

import

import

import

import

public

class

MainActivity

extends

Activity

implements

OnClickListener

{

private

final

static

String

LOG_TAG

=

"";

private

Button

startButton

=

null;

@Override

public

void

onCreate(Bundle

savedInstanceState)

{

(savedInstanceState);

setContentView

startButton

=

(Button)findViewById

(this);

(LOG_TAG,

"Main

Activity

Created.");

}

@Override

public

void

onClick(View

v)

{

if(startButton))

{

Intent

intent

=

new

Intent("");

startActivity(intent);

}

}

}

它的實現(xiàn)很簡單,當點擊它上面的一個按鈕的時候,就會啟動另外一個名字為“的Actvity。

名字為“的Actvity實現(xiàn)在src/shy/luo/activity/文件中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""package

import

import

import

import

import

import

public

class

SubActivity

extends

Activity

implements

OnClickListener

{

private

final

static

String

LOG_TAG

=

"";

private

Button

finishButton

=

null;

@Override

public

void

onCreate(Bundle

savedInstanceState)

{

(savedInstanceState);

setContentView

finishButton

=

(Button)findViewById

(this);

(LOG_TAG,

"Sub

Activity

Created.");

}

@Override

public

void

onClick(View

v)

{

if(finishButton))

{

finish();

}

}

}

它的實現(xiàn)也很簡單,當點擊上面的一個銨鈕的時候,就結束自己,回到前面一個Activity中去。

這里我們可以看到,Android應用程序架構中非常核心的一點:MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的接口,但是它可以通過一個字符串來告訴應用程序框架層,它要啟動的Activity的名稱是什么,其它的事情就交給應用程序框架層來做,當然,應用程序框架層會根據(jù)這個字符串來找到其對應的Activity,然后把它啟動起來。這樣,就使得Android應用程序中的Activity藕合性很松散,從而使得Android應用程序的模塊性程度很高,并且有利于以后程序的維護和更新,對于大型的客戶端軟件來說,這一點是非常重要的。

當然,應用程序框架能夠根據(jù)名字來找到相應的Activity,是需要應用程序本身來配合的,這就是要通過應用程序的配置文件來實現(xiàn)了:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""<xml

version=""

encoding="utf-8">

<manifest

xmlns:android=""

package=""

android:versionCode="1"

android:versionName="">

<application

android:icon="@drawable/icon"

android:label="@string/app_name">

<activity

android:name=".MainActivity"

android:label="@string/app_name">

<intent-filter>

<action

android:name=""

/>

<category

android:name=""

/>

</intent-filter>

</activity>

<activity

android:name=".SubActivity"

android:label="@string/sub_activity">

<intent-filter>

<action

android:name=""/>

<category

android:name=""/>

</intent-filter>

</activity>

</application>

</manifest>

從這個配置文件中,我們可以看到,MainActivity被配置成了應用程序的默認Activity,即用戶在手機屏幕上點擊Activity應用程序圖標時,Launcher就會默認啟動MainActivity這個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=""

/>

<category

android:name=""

/>

</intent-filter>

</activity>

這個配置文件也將名字“和SubActivity關聯(lián)了起來,因此,應用程序框架層能夠根據(jù)名字來找到它:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""<activity

android:name=".SubActivity"

android:label="@string/sub_activity">

<intent-filter>

<action

android:name=""/>

<category

android:name=""/>

</intent-filter>

</activity>

下面再列出這個應用程序的界面配置文件和字符串文件。

界面配置文件在res/layout目錄中,文件對應MainActivity的界面:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""<xml

version=""

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>

而對應SubActivity的界面:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""<xml

version=""

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>

字符串文件位于res/values/文件中:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""<xml

version=""

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>

最后,我們還要在工程目錄下放置一個編譯腳本文件:\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)

這樣,整個例子的源代碼實現(xiàn)就介紹完了,接下來就要編譯了。有關如何單獨編譯Android源代碼工程的模塊,以及如何打包,請參考如何單獨編譯Android源代碼中的模塊一文。

執(zhí)行以下命令進行編譯和打包:\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)鏡像文件就包含我們前面創(chuàng)建的Activity應用程序了。

再接下來,就是運行模擬器來運行我們的例子了。關于如何在Android源代碼工程中運行模擬器,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。

執(zhí)行以下命令啟動模擬器:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""USER-NAME@MACHINE-NAME:~/Android$

emulator

模擬器啟動起,就可以在屏幕上看到Activity應用程序圖標了:

點擊Activity這個應用程序圖標后,Launcher就會把MainActivity啟動起來:

點擊上面的Startsub-activity銨鈕,MainActivity內部就會通過startActivity接口來啟動SubActivity:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o""Intent

intent

=

new

Intent("");

startActivity(intent);

如下圖所示:

無論是通過點擊應用程序圖標來啟動Activity,還是通過Activity內部調用startActivity接口來啟動新的Activity,都要借助于應用程序框架層的ActivityManagerService服務進程。在前面一篇文章Android系統(tǒng)在新進程中啟動自定義服務過程(startService)的原理分析中,我們已經(jīng)看到,Service也是由ActivityManagerService進程來啟動的。在Android應用程序框架層中,ActivityManagerService是一個非常重要的接口,它不但負責啟動Activity和Service,還負責管理Activity和Service。

Android應用程序框架層中的ActivityManagerService啟動Activity的過程大致如下圖所示:

在這個圖中,ActivityManagerService和ActivityStack位于同一個進程中,而ApplicationThread和ActivityThread位于另一個進程中。其中,ActivityManagerService是負責管理Activity的生命周期的,ActivityManagerService還借助ActivityStack是來把所有的Activity按照后進先出的順序放在一個堆棧中;對于每一個應用程序來說,都有一個ActivityThread來表示應用程序的主進程,而每一個ActivityThread都包含有一個ApplicationThread實例,它是一個Binder對象,負責和其它進程進行通信。

下面簡要介紹一下啟動的過程:

Step1.

無論是通過Launcher來啟動Activity

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論