Android應用程序的Activity啟動過程簡要介紹和學習專題計劃_第1頁
Android應用程序的Activity啟動過程簡要介紹和學習專題計劃_第2頁
Android應用程序的Activity啟動過程簡要介紹和學習專題計劃_第3頁
Android應用程序的Activity啟動過程簡要介紹和學習專題計劃_第4頁
Android應用程序的Activity啟動過程簡要介紹和學習專題計劃_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

\o"Android應用程序Activity啟動過程簡要簡介和學習籌劃"Android應用程序Activity啟動過程簡要簡介和學習籌劃分類:Android-08-1415:461047人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

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

在Android系統(tǒng)中,有兩種操作會引起Activity啟動,一種顧客點擊應用程序圖標時,Launcher會為咱們啟動應用程序主Activity;應用程序默認Activity啟動起來后,它又可以在內(nèi)部通過調(diào)用startActvity接口啟動新Activity,依此類推,每一種Activity都可以在內(nèi)部啟動新Activity。通過這種連鎖反映,按需啟動Activity,從而完畢應用程序功能。

這里,咱們通過一種詳細例子來闡明如何啟動Android應用程序Activity。Activity啟動方式有兩種,一種是顯式,一種是隱式,隱式啟動可以使得Activity之間藕合性更加松散,因而,這里只關(guān)注隱式啟動Activity辦法。

一方面在Android源代碼工程packages/experimental目錄下創(chuàng)立一種應用程序工程目錄Activity。關(guān)于如何獲得Android源代碼工程,請參照在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關(guān)于如何在Android源代碼工程中創(chuàng)立應用程序工程,請參照在Ubuntu上為Android系統(tǒng)內(nèi)置Java應用程序測試ApplicationFrameworks層硬件服務一文。這里,工程名稱就是Activity了,它定義了一種途徑為shy.luo.activitypackage,這個例子源代碼重要就是實當前這里了。下面,將會逐個簡介這個package里面文獻。

應用程序默認Activity定義在src/shy/luo/activity/MainActivity.java文獻中:\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);

}

}

}

它實現(xiàn)很簡樸,當點擊它上面一種按鈕時候,就會啟動此外一種名字為“shy.luo.activity.subactivity”Actvity。

名字為“shy.luo.activity.subactivity”Actvity實當前src/shy/luo/activity/SubActivity.java文獻中:\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();

}

}

}

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

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

固然,應用程序框架可以依照名字來找到相應Activity,是需要應用程序自身來配合,這就是要通過應用程序配備文獻AndroidManifest.xml來實現(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>

從這個配備文獻中,咱們可以看到,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="ent.action.MAIN"

/>

<category

android:name="ent.category.LAUNCHER"

/>

</intent-filter>

</activity>

這個配備文獻也將名字“shy.luo.activity.subactivity”和SubActivity關(guān)聯(lián)了起來,因而,應用程序框架層可以依照名字來找到它:\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>

下面再列出這個應用程序界面配備文獻和字符串文獻。

界面配備文獻在res/layout目錄中,main.xml文獻相應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相應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>

字符串文獻位于res/values/strings.xml文獻中:\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>

最后,咱們還要在工程目錄下放置一種編譯腳本文獻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)

這樣,整個例子源代碼實現(xiàn)就簡介完了,接下來就要編譯了。關(guān)于如何單獨編譯Android源代碼工程模塊,以及如何打包system.img,請參照如何單獨編譯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)鏡像文獻system.img就包括咱們前面創(chuàng)立Activity應用程序了。

再接下來,就是運營模仿器來運營咱們例子了。關(guān)于如何在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內(nèi)部就會通過startActivity接口來啟動SubActivity:\o"viewplain"viewplain\o"copytoclipboard"copytoclipboard\o"print"print\o"?"?Intent

intent

=

new

Intent("shy.luo.activity.subactivity");

startActivity(intent);

如下圖所示:

無論是通過點擊應用程序圖標來啟動Activity,還是通過Activity內(nèi)部調(diào)用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,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟動新Activity,都通過Binder進程間通信進入到ActivityManagerService進程中,并且調(diào)用ActivityManagerService.sta

溫馨提示

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

評論

0/150

提交評論