Android開發之旅 應用程式基礎及元件(續)

2021-09-22 07:06:44 字數 4413 閱讀 5476

——成功屬於耐得住寂寞的人,你離成功又近了一步了。

引言

上篇android開發之旅:應用程式基礎及元件介紹了應用程式的基礎知識及android的四個元件,本篇將介紹如何啟用組關閉元件等。本文的主題如下:

2、關閉元件

3、清單檔案

4、intent過濾器

1、啟用元件:意圖(intents)

當接收到contentresolver發出的請求後,內容提供者被啟用。而其它三種元件——活動、服務和廣播接收者,被一種叫做意圖(intent)的非同步訊息啟用。意圖是乙個儲存著訊息內容的intent物件。對於活動和服務來說,intent物件指明了請求的操作名稱以及作為操作物件的資料的uri和其它一些資訊。例如,它可以傳遞對活動的乙個請求,讓它為使用者顯示一張,或者讓使用者編輯一些文字。而對於廣播接收者而言,intent物件指明了廣播的行為。例如當照相按鈕被按下,它可以對所有感興趣的物件廣播。

對於每種元件來說,啟用的方法是不同的。下面將分別介紹活動、服務、廣播接收者元件的啟用方法。

1.1、活動(activity)元件的啟用

通過傳遞乙個intent物件至context.startactivity()或activity.startactivityforresult()以載入(或指定新工作給)乙個活動。相應的活動可以看到初始的意圖,這個意圖通過getintent() 方法來檢視啟用活動。android呼叫活動的onnewintent()方法傳遞任何後續的意圖。

乙個活動經常啟動了下乙個。如果它期望它所啟動的那個活動返回乙個結果,它會呼叫startactivityforresult()而不是startactivity()。例如,如果它啟動了乙個活動讓使用者挑選一張**,它可能會返回被選中的**。結果以乙個intent物件傳遞呼叫活動的onactivityresult() 方法。

1.2、服務(service)元件的啟用

通過傳遞乙個intent物件至context.startservice()以啟動乙個服務(或給予正在執行的服務以乙個新的指令)。android呼叫服務的onstart()方法並將intent物件傳遞給它。

1.3、廣播接收者(broadcast receiver)元件的啟用

應用程式可以通過將intent物件傳遞給

及其它類似方法來產生乙個廣播。android會通過onreceive()方法將intent傳遞給所有對此廣播有興趣的廣播接收者。

2、關閉元件

內容提供者僅在響應contentresolver提出請求的時候啟用。而乙個廣播接收者僅在響應廣播資訊的時候啟用。所以,沒有必要去顯式的關閉這些元件。

而活動則不同,它提供了使用者介面。與使用者進行會話,所以只要會話依然持續,哪怕對話程序空閒,它都會一直保持啟用狀態。與此相似,服務也會在很長一段時間內保持執行。所以android提供方法有序地關閉活動和服務。

當元件不再被使用的時候或者android必須要為更多活躍的元件**記憶體時,元件也可能會被系統關閉。

3、清單(manifest)檔案

當android啟動乙個應用程式元件之前,它必須知道那個元件是存在的。所以,應用程式會在乙個清單(manifest)檔案中宣告它的元件,這個檔案會被打包到android包中。這個.apk檔案還將包括應用程式的**、檔案以及其它資源。

這個清單檔案是xml結構的檔案,且所有的android應用程式都把它叫做androidmanifest.xml。為宣告乙個應用程式元件,它還會做很多額外工作,比如指明應用程式所需鏈結到的庫的名稱(除了預設的android庫之外)以及宣告應用程式期望獲得的各種許可權。

但清單檔案的主要功能仍然是向android宣告應用程式的元件。舉例說明,乙個活動可以如下宣告:

androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>

<

manifest . . . >

<

<

activity

android:name="com.example.project.freneticactivity"

android:icon="@drawable/small_pic.png"

android:label="@string/freneticlabel"

. . . >

activity

>

. . .

>

manifest

>

元素的name屬性指定了實現了這個活動的activity類的子類,icon和label屬性指向了包含展示給使用者的此活動的圖示和標籤的資源檔案。

其它元件也以類似的方法宣告—— 元素用於宣告服務, 元素用於宣告廣播接收者,而元素用於宣告內容提供者。清單檔案中未進行宣告的活動、服務以及內容提供者將不為系統所見,從而也就不會被執行。然而,廣播接收者既可以在清單檔案中宣告,也可以在**中動態的建立(作為broadcastreceiver物件)且呼叫context.registerreceiver()方式註冊到系統。

4、intent過濾器

intent物件可以顯式地指定目標元件。如果進行了這種指定,android會找到這個元件(依據清單檔案中的宣告)並啟用它。但如果intent沒有進行顯式的指定,android就必須為它找到對於intent來說最合適的元件。這個過程是通過比較intent物件和所有可能物件的intent過濾器完成的。元件的intent過濾器會告知android它所能處理的intent型別。如同其它關於元件的必要資訊一樣,它們在清單檔案中進行宣告的。這裡是上面示例的乙個擴充套件,其中加入了針對活動的兩個intent過濾器宣告:

androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>

<

manifest . . . >

<

<

activity

android:name="com.example.project.freneticactivity"

android:icon="@drawable/small_pic.png"

android:label="@string/freneticlabel"

. . . >

<

intent-filter . . . >

<

action

android:name="android.intent.action.main"

/>

<

category

android:name="android.intent.category.launcher"

/>

intent-filter>

<

intent-filter . . . >

<

action

android:name="com.example.project.bounce"

/>

<

data

android:mimetype="image/jpeg"

/>

<

category

android:name="android.intent.category.default"

/>

intent-filter>

activity

>

. . .

>

manifest

>

示例中的第乙個過濾器——action:「android.intent.action.main」和category:「android.intent.category.launcher」的組合,是常見的。它標記這個活動顯示在應用程式啟動器中,使用者在裝置上看到的可啟動的應用程式列表。換句話說,這個活動是應用程式的入口,是使用者選擇執行這個應用程式後所見到的第乙個活動。第二個過濾器宣告了這個活動針對特定型別的資料。

乙個元件可以擁有任意數量的intent過濾器,每個宣告一系列不同的能力。如果它沒有包含任何過濾器,它將只能被顯式宣告了目標元件名稱的意圖啟用。

對於廣播接收者,它在**中建立並註冊intent過濾器,直接作為intentfilter的物件例項化。其它過濾器則在清單檔案中設定。

如果您現在對這些概念還沒有完全理解,沒關係這裡我僅是讓大家有個印象,知道這些概念或術語的存在,知道他們大概是做什麼的。後面我還將陸續更詳細地到這些東西並結合一些例項,到時候您就會清楚地知道這些東西。

Android開發之旅 應用程式基礎及元件(續)

成功屬於耐得住寂寞的人,你離成功又近了一步了。引言 上篇android開發之旅 應用程式基礎及元件介紹了應用程式的基礎知識及android的四個元件,本篇將介紹如何啟用組關閉元件等。本文的主題如下 2 關閉元件 3 清單檔案 4 intent過濾器 1 啟用元件 意圖 intents 當接收到con...

Android移動應用程式開發

log類直接呼叫靜態方法輸出除錯資訊,在 logcat 視窗中輸出,並可以通過過濾器對標籤進行篩選。logcat 視窗中輸出的除錯資訊有以下5種形式 布局 線性布局linearlayout 進行水平或垂直排列布局。相對布局relativelayout 相對排列,即子控制項以相對父控制項或相對于父控制...

Android應用程式簽名

android系統要求所有的程式經過數字簽名才能安裝,如果沒有可用的數字簽名,系統將不許安裝執行此程式,不管是模擬器還是真實手機。因此,在裝置或者是模擬器上執行除錯程式之前,必須為應用程式設定數字簽名。android 系統僅僅會在安裝的時候測試簽名證書的有效期,如果應用程式的簽名是在安裝之後才到期,...