Android平臺架構跟應用程序基本概念解析

電腦雜談  發布時間:2020-02-15 04:01:22  來源:網絡整理

android手機程序是什么意思_android python 程序_android應用程序組成

對Android平臺應用程序的基本構架進行一個詳細知道,對于開發者來說能更有效的研發Android平臺應用程序.

對于一個Android應用程序來說,是由四種構造塊組織而成的,這四種構造塊如下:

Activity

Intent Receiver

Service

Content Provider

但是,并不是每一個Android平臺應用程序都必須這四種構造塊,這不是必須的,某些時候,我們只應該這四種中的幾種組合成我們的應用。

當我們明確了我們的應用必須哪些構造塊后,我們就必須在AndroidManifest.xml中登記這些構造塊的清單。這是一個XML配置文件,這個配置文件用于定義我們的應用程序的模塊、組件的功用及必要條件等。這個配置文件是每個Android應用必需的。對于AndroidMainfest.xml的Schema,參考SDK包附贈的文檔。以下,我們對四種構造塊做一些說明:

1、Activity

Activity是Android平臺應用程序中構造塊中更基本的一種,在應用中,一個 activity通常就是一個單獨的屏幕。每一個activity都被推動為一個獨立的類,并且繼承于Activity這個基類。這個activity類將會顯示由幾個Views控件組成的用戶接口,并對事件作出響應。大部份的應用就會包括多個的屏幕。例如,一個短消息應用程序將會有一個屏幕用于顯示聯系人列表,第二個屏幕用于寫短消息,同時還能有用于瀏覽舊短消息及進行平臺修改的屏幕。每一個這樣的屏幕,就是一個activity。從一個屏幕導航到另一個屏幕是很簡單的。在一些應用中,一個屏幕或者會返回值給前一個屏幕。

當一個新的屏幕打開后,前一個屏幕將會暫停,并保存在歷史堆棧中。用戶可以返回至歷史堆棧中的前一個屏幕。當屏幕不再使用時,還可以從歷史堆棧中刪除。默認情況下,Android將會保留從主屏幕到每一個應用的運行屏幕。

Android平臺應用程序使用了Intent這個特殊類,實現在屏幕與屏幕之間移動。 Intent類用于表述一個應用將會做哪些事。在Intent的表述結構中,有兩個最重要的個別:動作跟動作對應的數據。典型的動作類別有:MAIN(activity的門戶)、VIEW、PICK、EDIT等。而動作對應的數據則以URI的方式進行表示。例如:要查看一個人的聯系模式,你必須建立一個動作類別為VIEW的intent,以及一個表示這個人的URI。

與之有關系的一個類叫IntentFilter。相對于intent是一個有效的做某事的請求,一個intent filter則用于表述一個activity(或者Intent Receiver)能夠操作這些intent。一個activity如果應顯示一個人的聯系模式時,需要聲明一個IntentFilter,這個 IntentFilter要知道怎么去處理VIEW動作跟表示一個人的URI。IntentFilter需要在AndroidManifest.xml中定義。

android python 程序_android應用程序組成_android手機程序是什么意思

通過解析各種intent,從一個屏幕導航到另一個屏幕是很簡單的。當向前導航時,activity將會讀取 startActivity(Intent myIntent)方法。然后,系統會在所有安裝的應用程序中定義的IntentFilter中查找,找到更匹配myIntent的Intent對應的 activity。新的activity接收至myIntent的通知后,開始運行。當startActivity方法被調用將觸發解析myIntent 的動作,這個模式提供了兩個關鍵好處:

A、Activities能夠重復運用從其他模塊中以Intent的方式形成的一個請求;

B、Activities可以在任何之后被一個具有相似IntentFilter的新的Activity取代。

2、Intent Receiver

當你希望你的應用無法對一個外部的事件(如當電話呼入時,或者數據網絡可用時,或者至了晚上時)做出響應,你可以使用一個Intent Receiver。雖然Intent Receiver在感興趣的事故出現時,會使用NotificationManager通知客戶,但它并不能生成一個UI。Intent Receiver在AndroidManifest.xml中注冊,但也可以在代碼中使用 Context.registerReceiver()進行登錄。當一個intent receiver被觸發時,你的應用不必對請求調用intent receiver,系統會在必須的之后開啟你的應用。各種應用還可以借助使用Context.broadcastIntent()將他們自己的 intent receiver廣播給其他應用程序。

3、Service

一個Service是一段長生命周期的,沒有用戶界面的程序。比較好的一個例子就是一個正在從播放列表中播放插曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個activity,讓使用者可以選取歌曲并播放樂曲。然而,音樂重放這個功能并沒有對應的activity,因為使用者當然會覺得在導航到其他屏幕時音樂必須還在播放的。在這個示例中,媒體播放器這個 activity會使用Context.startService()來推進一個service,從而可以在后臺保持音樂的播放。同時,系統也將維持這個service一直執行,直到這個service運行結束。另外,我們還可以借助使用Context.bindService()方法,連接至一個service上(如果這個service還沒有運行將推進它)。當連接至一個service之后,我們還可以service提供的接口與它進行通訊。拿媒體播放器這個實例來說,我們還可以進行暫停、重播等操作。

4、Content Provider

Android平臺應用程序能夠將他們的數據保存至文件中、SQL中,甚至是任何有效的設備中。當你想將你的應用數據與其他的應用共享時,Content Provider將會很有用。一個Content Provider類實現了一組標準的方式,從而無法使其他的應用保存或調用此Content Provider處理的各類數據類型。

Android開發系統的構架模型,Google官方尚未用一個很簡單的構架圖清晰的進行了表明,簡單來說Android開發系統就是 Linux + Google在其上自己開發的Java虛擬機和運行時 + Android SDK 構成,這些內容供我們知道就可以了。就研發一個完整的Android應用來說,我將對我們非常重要而Google官方文檔又說的有些復雜的,關于一個完整的Android程序的靜態組成模型,和動態運行時模型,整理成了一張圖形如下,我們就從這張圖說起:

先看的Activity,這個組件我們可以覺得它是Windows中的窗體概念,這是Android程序的基本構成個別,也就是程序的人機交互界面。比如一個簡單的短信程序就必須包括三個Activity,一個短信列表界面,一個閱讀郵件詳細內容的圖標和一個編輯短信的界面。

先來看圖形中的黑色部分,這部分描述了一個完整的Android應用程序可以包括的各個構成個別,我們將組成一個Android程序的模塊稱為Android Component(圖中后面部分的基類),由若干個Android Component就構成了一個完整的Android應用程序。

圖中左上角的Service顧名思議就是服務,一個Android程序中這些個別是服務呢舉例來說,短信程序并不僅僅在我們開啟短信界面的之后才去索要短信,我們退出界面后,手機一直會去收取短信,并在新的短信到達時通知我們,所以必定有某個任務在后臺運行著,這就是Service了;再比如說音樂播放功能,當我們從播放界面返回手機待機界面的之后一直可以再次聽音樂,這只是一個Service的舉例。

android應用程序組成_android python 程序_android手機程序是什么意思

其實Activity + Service是相當常用的電腦硬件應用,比如我應做的BlogMessage同樣也有這種的結構。

左邊中間部分的“Broadcast Receiver”是用于接收各類平臺定義事件或自定義事件的,如果我們的程序想偵測一些平臺事件的出現,我們就必須寫一個Broadcast Receiver。例如我們的程序想在電腦開啟Wifi的之后立刻去刷新最新的數據,或者我們想在電腦來電時執行某個動作,這些都可以由Broadcast Receiver訂閱特定的事件來完成。

圖中右邊剩下的“Content Provider”,我們可以把它理解成一種特殊的Service,一種可以幫其它程序提供數據的Service,例如電腦中的聯系人信息,我們任何程序都可以跟其通信去獲得聯系人的信息,這就可實現為一個典型的Content Provider。

再來看圖中紅色的個別,這是一個靜態的部署概念,就正如我們.Net開發的程序集的概念一樣。Apk是我們Android程序公布跟部署的基本單位,一個完整的Android程序就可以打包為一個或多個Apk進行公布,我們從Android Marketing上下載安裝的程序只是一個個的Apk包,我們在Eclipse 中的一個Project的最終Build結果也就是一個Apk文件。一個Apk中包括了里面介紹的4種Android Component。

最后,圖中紅色的個別就是系統運行時的概念了。由于Android系統是基于Linux的,所以Process(進程)和Thread(線程)的概念跟Linux中的一致,在代碼中我們可以編寫一個普通的Java Thread來實現多線程。需要注意的是,Android中的Process是受平臺自動管理的,并不是說我們在一個程序圖標中按了電腦上的Back鍵以及Home鍵程序就結束了,大家也很難在Android的各類程序中找到類似Symbian程序中的“退出”功能。

Android系統會幫每一個進程都計算出一個“重要程度”等級,在平臺運行的某個之后諸如資源不足的過后,系統會按照各個進程的“重要程度”來決定先釋放那個進程。(進程“重要程度”的判定在Google的官方文檔還是說的非常明白的,實際上各個Android Component都有更完整的運行時生命周期,由于我們不太清楚進程結束的契機,了解各個Android Component的運行時生命周期以及相關事件就對我們的開發來說非常重要,我會正式在后續的后記中具體體現這種內容)。一個Apk中包括的Android Component在運行時可以運行在同一個進程中,也可以運行在不同的進程中,這取決于我們在Apk的AndroidManifest.xml上進行的配置(大家可以將這個AndroidManifest.xml看成是Apk的全局配制信息,其中會敘述這個Apk中包括了什么Android Component以及各個Component的運行和推進模式)。

最后,圖中以下中間部分的“Task”是Android中一個很特殊的運行時概念,也是很復雜的一個概念,Google的官方文檔用了巨大的篇幅來表明這個概念。它有別于進程跟線程android應用程序組成,并且只和Activity的運行時有關系。我們可以將其理解成“窗口?!?,這是由手機上的特殊操作模式所引發的概念。

由于電腦上的程序,用戶通常只能在同一時間看到一個界面,例如在編輯短信的之后通常就不能看到短信列表的圖標。而一個完整的程序通常會由多個Activity組成,所以這種Activity會在運行時隨著打開的相繼順序會被放在同一個窗口棧(Task)中,當前活動窗口棧中最前面的Activity就是用戶當前看到的圖標,按電腦上的“Back”則是銷毀當前棧頂的Activity,回到上一個界面。然而Task這個概念之所以復雜,是因為不同Process中的Activity可以被放在同一個Task中,例如在我們的程序中可能會打開Google Map的地圖界面。

具體Activity在運行時該被放在那個Task中,這會由Activity的taskAffinity屬性決定,一般狀況下一個Apk中的所有Activity在運行時會被放在同一個Task中,但是運行時Activity的taskAffinity是可以設置的。例如前面說的Google Map的舉例,地圖顯示圖標默認是存在于Google Map這個程序的默認Task中的,但是我們仍可以在運行時將這個界面帶至我們自己程序的當前Task中來。


本文來自電腦雜談,轉載請注明本文網址:
http://www.772070.live/a/jisuanjixue/article-140810-1.html

相關閱讀
發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

熱點圖片
拼命載入中...
天津快乐十分20选8技巧