官术网_书友最值得收藏!

1.4 核心組件

在分析Android 4.4的源碼之前,很有必要了解一下Android應(yīng)用程序的核心組件功能。一個典型的Android應(yīng)用程序通常由五個組件組成,這五個組件構(gòu)成了Android的核心功能。在本節(jié)的內(nèi)容中,將詳細講解這五大組件的基本知識。

1.4.1 Activity界面

Activity是這五個組件中最常用的一個組件。程序中Activity通常的表現(xiàn)形式是一個單獨的界面(screen)。每個Activity都是一個單獨的類,它擴展實現(xiàn)了Activity基礎(chǔ)類。這個類顯示為一個由Views組成的用戶界面并響應(yīng)事件。大多數(shù)程序有多個Activity。例如,一個文本信息程序有這么幾個界面:顯示聯(lián)系人列表界面,寫信息界面,查看信息界面或者設(shè)置界面等。每個界面都是一個Activity。切換到另一個界面就是載入一個新的Activity。某些情況下,一個Activity可能會給前一個Activity返回值——例如,一個讓用戶選擇相片的Activity會將選擇到的相片返回給其調(diào)用者。

打開一個新界面后,前一個界面就被暫停,并放入歷史棧中(界面切換歷史棧)。使用者可以回溯前面已經(jīng)打開的存放在歷史棧中的界面。也可以從歷史棧中刪除沒有界面價值的界面。Android在歷史棧中保留程序運行產(chǎn)生的所有界面:從第一個到最后一個。

1.4.2 Intent和Intent Filters

Android通過一個專門的Intent類來進行界面的切換。Intent描述了程序想做什么(Intent意為意圖、目的、意向)。Intent類還有一個相關(guān)類IntentFilter。Intent是一個請求來做什么事情,Intent Filters則描述了一個Activity(或下文的Intent Receiver)能處理什么意圖。顯示某人聯(lián)系信息的Activity使用了一個IntentFilter,就是說它知道如何處理應(yīng)用到此人數(shù)據(jù)的View(視圖)操作。Activity在文件AndroidManifest.xml中使用Intent Filters。

通過解析Intent可以實現(xiàn)Activity的切換,可以使用startActivity(myIntent)啟用新的Activity。系統(tǒng)會考察所有安裝程序的Intent Filters,然后找到與myIntent匹配最好的Intent Filters所對應(yīng)的Activity。這個新Activity能夠接收Intent傳來的消息,并因此被啟用。解析Intent的過程發(fā)生在startActivity被實時調(diào)用時,這樣做有如下兩個好處。

(1)Activity僅發(fā)出一個Intent請求,便能重用其他組件的功能。

(2)Activity可以隨時被替換為有等價IntentFilter的新Activity。

1.4.3 Service服務(wù)

Service是一個沒有UI且常駐系統(tǒng)的代碼,最常見的例子是媒體播放器從播放列表中播放歌曲。在媒體播放器程序中,可能有一個或多個Activities讓用戶選擇播放的歌曲。然而在后臺播放歌曲時無須Activity干涉,因為用戶希望在音樂播放同時能夠切換到其他界面。既然這樣,媒體播放器Activity需要通過Context.startService()啟動一個Service,這個Service在后臺運行以繼續(xù)保持播放音樂。在媒體播放器被關(guān)閉之前,系統(tǒng)會保持音樂后臺播放Service的正常運行。可以使用Context.bindService()方法連接到一個Service上(如果Service未運行的話,連接后還會啟動它),連接后即可通過一個Service提供的接口與Service進行通話。對音樂Service來說,提供了暫停和重放等功能。

1.如何使用服務(wù)

在Android系統(tǒng)中,有如下兩種使用Service服務(wù)的方法。

(1)通過調(diào)用Context.startServece()啟動服務(wù),調(diào)用Context.stoptService()結(jié)束服務(wù),startService()可以傳遞參數(shù)給Service。

(2)通過調(diào)用Context.bindService()啟動,調(diào)用Context.unbindService()結(jié)束,還可以通過ServiceConnection訪問Service。兩者可以混合使用,比如可以先startServece()再unbindService()。

2.Service的生命周期

在使用startService()方法啟動服務(wù)后,即使調(diào)用startService()的進程結(jié)束了,Service仍然存在,一直到有進程調(diào)用stoptService()或Service自己滅亡(stopSelf())為止。

在bindService()后,Service就和調(diào)用bindService()的進程“同生共死”,也就是說當(dāng)調(diào)用bindService()的進程死了,那么它綁定的Service也要跟著被結(jié)束,當(dāng)然期間也可以調(diào)用unbindService()讓Service結(jié)束。

當(dāng)混合使用上述兩種方式時,例如你startService()了,我bindService()了,那么只有你stoptService()了而且我也unbindService()了,這個Service才會被結(jié)束。

3.進程生命周期

在Android系統(tǒng)中會嘗試保留那些啟動的或者綁定的服務(wù)進程,具體規(guī)則如下。

(1)如果該服務(wù)正在進程的onCreate()、onStart()或者onDestroy()方法中執(zhí)行時,那么主進程將會成為一個前臺進程,以確保此代碼不會被停止。

(2)如果服務(wù)已經(jīng)開始,那么它的主進程的重要性會低于所有的可見進程,但是會高于不可見進程。由于只有少數(shù)幾個進程是用戶可見的,所以只要不是內(nèi)存特別低,該服務(wù)就不會停止。

(3)如果有多個客戶端綁定了服務(wù),只要客戶端中的一個對于用戶是可見的,即可認為該服務(wù)可見。

1.4.4 Broadcast Receiver發(fā)送廣播

在Android系統(tǒng)中,Broadcast Receiver是一個廣播接收器組件。廣播接收器是一個專注于接收廣播通知信息,并做出對應(yīng)處理的組件。很多廣播是源自于系統(tǒng)代碼的,比如,通知時區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應(yīng)用程序也可以進行廣播——比如說,通知其他應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。應(yīng)用程序可以擁有任意數(shù)量的廣播接收器以對所有它感興趣的通知信息予以響應(yīng),所有的接收器均繼承自BroadcastReceiver基類。

在Android系統(tǒng)中,Broadcast Receiver廣播接收器沒有用戶界面。然而,它們可以啟動一個Activity來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力——閃動背燈、震動、播放聲音等。一般來說是在狀態(tài)欄上放一個持久的圖標(biāo),用戶可以打開它并獲取消息。

Android中的廣播事件有兩種,一種是系統(tǒng)廣播事件,比如:ACTION_BOOT_COMPLETED(系統(tǒng)啟動完成后觸發(fā)),ACTION_TIME_CHANGED(系統(tǒng)時間改變時觸發(fā)),ACTION_BATTERY_LOW(電量低時觸發(fā))等。另外一種是自定義的廣播事件。

在Android系統(tǒng)中,廣播事件的基本流程如下所示。

(1)注冊廣播事件:注冊方式有兩種:

一種是靜態(tài)注冊,即在AndroidManifest.xml文件中定義,注冊的廣播接收器必須要繼承BroadcastReceiver。

是一種是動態(tài)注冊,是在程序中使用Context.registerReceiver注冊,注冊的廣播接收器相當(dāng)于一個匿名類。兩種方式都需要IntentFIlter。

(2)發(fā)送廣播事件:通過Context.sendBroadcast來發(fā)送,由Intent來傳遞注冊時用到的Action。

(3)接收廣播事件:當(dāng)發(fā)送的廣播被接收器監(jiān)聽到后,會調(diào)用它的onReceive()方法,并將包含消息的Intent對象傳給它。onReceive中代碼的執(zhí)行時間不要超過5s,否則Android會彈出超時對話框。

1.4.5 用Content Provider存儲數(shù)據(jù)

在Android系統(tǒng)中,應(yīng)用程序會把數(shù)據(jù)存儲在一個SQLite數(shù)據(jù)庫格式文件中,或者存儲在其他有效設(shè)備里。如果想讓其他程序能夠使用程序中的數(shù)據(jù),此時Content Provider就很有用了。Content Provider是一個實現(xiàn)了一系列標(biāo)準(zhǔn)方法的類,這個類使得其他程序能存儲、讀取某種Content Provider可處理的數(shù)據(jù)。

主站蜘蛛池模板: 资溪县| 边坝县| 淅川县| 调兵山市| 德兴市| 高密市| 枣阳市| 远安县| 夏津县| 禹州市| 商丘市| 赣榆县| 绥芬河市| 定兴县| 阳泉市| 呼图壁县| 肇源县| 定州市| 区。| 同心县| 邛崃市| 会泽县| 钦州市| 定襄县| 柘城县| 尖扎县| 通州市| 通渭县| 饶河县| 福贡县| 大竹县| 读书| 南部县| 法库县| 娄底市| 陕西省| 隆化县| 安达市| 清苑县| 客服| 武山县|