活動是最基本的 Android 應(yīng)用程序組件,應(yīng)用程序中,一個活動通常就是一個單獨的屏幕。每一個活動 都被實現(xiàn)為一個獨立的類,并且從活動基類中繼承而來,活動類將會顯示由視圖控件組成的用戶接口,并對 事件做出響應(yīng)。大多數(shù)的應(yīng)用是由多個屏幕顯示組成。例如:一個文本信息的應(yīng)用也許有一個顯示發(fā)送消息的 聯(lián)系人列表屏幕,第二個屏幕用來寫文本消息和選擇收件人,再來一個屏幕查看消息歷史或者消息設(shè)置操作 等。這里每一個這樣的屏幕就是一個活動,很容易實現(xiàn)從一個屏幕到一個新的屏幕并且完成新的活動。在某 些情況下當前的屏幕也許需要向上一個屏幕活動提供返回值--比如讓用戶從手機中挑選一張照片返回通訊錄 做為電話撥入者的頭像。 當一個新的屏幕打開后,前一個屏幕將會暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中的前 一個屏幕。當屏幕不再使用時,還可以從歷史堆棧中刪除。默認情況下,Android 將會保留從主屏幕到每一 個應(yīng)用的運行屏幕。 簡單理解 Activity 代表一個用戶所能看到的屏幕,Activity 主要是處理一個應(yīng)用的整體性工作,例如,監(jiān) 聽系統(tǒng)事件(按鍵事件、觸摸屏事件等)、為用戶顯示指定的 View,啟動其他 Activity 等。所有應(yīng)用的 Activity 都繼承于android.app.Activity 類,該類是 Android 提供的基層類,其他的 Activity 繼承該父類后,通過 Override 父類的方法來實現(xiàn)各種功能,這種設(shè)計在其他領(lǐng)域也較為常見。 調(diào)用 Android 專有類 Intent 進行架構(gòu)屏幕之間的切換。Intent 是描述應(yīng)用想要做什么。Intent 數(shù)據(jù)結(jié)構(gòu)兩 個最重要的部分是動作和動作對應(yīng)的數(shù)據(jù)。典型的動作類型有:MAIN(活動的門戶)、 VIEW、PICK、EDIT 等。而動作對應(yīng)的數(shù)據(jù)則以 URI 的形式進行表示。例如:要查看某個人的聯(lián)系方式,你需要創(chuàng)建一個動作類 型為 VIEW 的 Intent,以及一個表示這個人的 URI。 Android 使用了 Intent 這個特殊類,實現(xiàn)在屏幕與屏幕之間移動。Intent 類用于描述一個應(yīng)用將會做什么 事。在 Intent 的描述結(jié)構(gòu)中,有兩個最重要的部分:動作和動作對應(yīng)的數(shù)據(jù)。典型的動作類型有: AIN(activity 的門戶)、 VIEW、PICK、EDIT 等。而動作對應(yīng)的數(shù)據(jù)則以 URI 的形式進行表示。例如:要查看一個人的聯(lián) 系方式,你需要創(chuàng)建一個動作類型為 VIEW 的 intent,以及一個表示這個人的 URI。 與之有關(guān)系的一個類叫 IntentFilter。相對于 intent 是一個有效的做某事的請求,一個 intentfilter 則用于描 述一個 activity(或者 IntentReceiver)能夠操作哪些 intent。一個 activity 如果要顯示一個人的聯(lián)系方式時,需 要聲明一個 IntentFilter,這個 IntentFilter 要知道怎么去處理 VIEW 動作和表示一個人的 URI。IntentFilter 需 要在AndroidManifest.xml 中定義。 通過解析各種 intent,從一個屏幕導(dǎo)航到另一個屏幕是很簡單的。當向前導(dǎo)航時, activity 將會調(diào)用 startActivity(IntentmyIntent)方法。然后,系統(tǒng)會在所有安裝的應(yīng)用程序中定義的 IntentFilter 中查找,找到最 匹配 myIntent 的 Intent 對應(yīng)的 activity。新的 activity 接收到 myIntent 的通知后,開始運行。當 startActivity 方 法被調(diào)用將觸發(fā)解析 myIntent 的動作,這個機制提供了兩個關(guān)鍵好處: A、Activities 能夠重復(fù)利用從其它組件中以 Intent 的形式產(chǎn)生的一個請求; B、Activities 可以在任何時候被一個具有相同 IntentFilter 的新的 Activity 取代。 當你希望你的應(yīng)用能夠?qū)σ粋€外部的事件(如當電話呼入時,或者數(shù)據(jù)網(wǎng)絡(luò)可用時,或者到了晚上時)做出響 應(yīng),你可以使用一個 IntentReceiver。雖然 IntentReceiver 在感興趣的事件發(fā)生時,會使用NotificationManager通知用戶,但它并不能生成一個 UI。IntentReceiver 在AndroidManifest.xml 中注冊,但也可以在代碼中使用Context.registerReceiver()進行注冊。當一個 intentreceiver 被觸發(fā)時,你的應(yīng)用不必對請求調(diào)用 intentreceiver, 系統(tǒng)會在需要的時候啟動你的應(yīng)用。各種應(yīng)用還可以通過使用Context.broadcastIntent() 將它們自己的intentreceiver 廣播給其它應(yīng)用程序。 一個 Service 是一段長生命周期的,沒有用戶界面的程序。比較好的一個例子就是一個正在從播放列表中 播放歌曲的媒體播放器。在一個媒體播放器的應(yīng)用中,應(yīng)該會有多個 activity,讓使用者可以選擇歌曲并播放 歌曲。然而,音樂重放這個功能并沒有對應(yīng)的 activity,因為使用者當然會認為在導(dǎo)航到其它屏幕時音樂應(yīng)該 還在播放的。在這個例子中,媒體播放器這個 activity 會使用Context.startService()來啟動一個 service,從而可以在后臺保持音樂的播放。同時,系統(tǒng)也將保持這個 service 一直執(zhí)行,直到這個 service 運行結(jié)束。另外, 我們還可以通過使用Context.bindService()方法,連接到一個 service 上(如果這個 service 還沒有運行將啟動它)。當連接到一個 service 之后,我們還可以 service 提供的接口與它進行通訊。拿媒體播放器這個例子來說,我們還可以進行暫停、重播等操作。 Android 應(yīng)用程序能夠?qū)⑺鼈兊臄?shù)據(jù)保存到文件、SQLite 數(shù)據(jù)庫中,甚至是任何有效的設(shè)備中。當你想 將你的應(yīng)用數(shù)據(jù)與其它的應(yīng)用共享時,內(nèi)容提供器就可以發(fā)揮作用了。因為內(nèi)容提供器類實現(xiàn)了一組標準的 方法,從而能夠讓其它的應(yīng)用保存或讀取此內(nèi)容提供器處理的各種數(shù)據(jù)類型。 數(shù)據(jù)是應(yīng)用的核心。在 Android 中,默認使用鼎鼎大名的 SQLite 作為系統(tǒng) DB。但是在 Android 中,使用方 法有點小小的不一樣。在 Android 中每一個應(yīng)用都運行在各自的進程中,當你的應(yīng)用需要訪問其他應(yīng)用的數(shù) 據(jù)時,也就需要數(shù)據(jù)在不同的虛擬機之間傳遞,這樣的情況操作起來可能有些困難(正常情況下,你不能讀取 其他的應(yīng)用的 db 文件),ContentProvider 正是用來解決在不同的應(yīng)用包之間共享數(shù)據(jù)的工具。
所有被一個 Android 應(yīng)用程序創(chuàng)建的偏好設(shè)置,文件和數(shù)據(jù)庫都是私有的。 為了和其他應(yīng)用程序共享數(shù)據(jù),應(yīng)用程序不得不創(chuàng)建一個 ContentProvider要回索其他應(yīng)用程序的數(shù)據(jù),它自己的 ContentProvider 必須被調(diào)用Android 本地 ContentProvider 包括:
CallLog:地址和接收到的電話信息 Contact.People.Phones:存儲電話號碼 Setting.System:系統(tǒng)設(shè)置和偏好設(shè)置 等等 </div |