【正文】
。 對(duì)于在代碼中創(chuàng)建并注冊(cè)的 broadcast receiver 來說, intent 過濾器將被直接實(shí)例化 IntentFilter 為對(duì)象。 一個(gè)組件可以擁有任意數(shù)量的 intent 過濾器,每個(gè)都聲明了一套不同的功能。換句話說,這個(gè) activity是應(yīng)用程序的入口點(diǎn),是用戶在啟動(dòng)器中選擇運(yùn)行這個(gè)應(yīng)用程序后所見到的第一個(gè) activity。返里有一個(gè)對(duì)先前例子的擴(kuò)展,其中加入了針對(duì) activity的兩個(gè) intent 過濾器: 示例中的第一個(gè)過濾器 ——action“”和category“”的組合 ——是常見的一個(gè)。組件的 intent 過濾器會(huì)通知 Android 它所能處理的 intent 類型。但如果 intent 沒 有顯式地指定一個(gè)目標(biāo), Android 就必須找到最合適的組件來響應(yīng)此 intent。 Intent 過濾器 一個(gè) Intent 對(duì)象可以顯式地指定一個(gè)目標(biāo)組件。未在 manifest 文件中進(jìn)行聲明的 activity、 service 以及 content provider 將不為系統(tǒng)所見,從而也就永不會(huì)被運(yùn)行。 icon和 label屬性指向包含展示給用戶的此 activity的圖標(biāo)和標(biāo)簽的資源文件。 但 manifest 文件最重要的任務(wù)是向 Android 報(bào)告此應(yīng)用程序的各個(gè)組件。 manifest 文件是一個(gè)結(jié)構(gòu)化的 XML文件,而且對(duì)于所有應(yīng)用程序,文件名總是 。 長春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 13 manifest 文件 當(dāng) Android 啟動(dòng)一個(gè)應(yīng)用程序組件之前,它必須知道那個(gè) 組件是存在的。 系統(tǒng)也會(huì)在組件不再被使用的時(shí)候戒者當(dāng) Android必須為更多的活動(dòng)組件回收內(nèi)存時(shí)關(guān)閉它。一個(gè) activity可 以通過調(diào)用finishActivity()方法來關(guān)閉另外一個(gè) activity(它用 startActivityForResult() 啟動(dòng)的)。所以 Android 為關(guān)閉 activity和 service 提供了一系列有序的方法。只要會(huì)話依然持續(xù),無論會(huì)話過程有無空閑, activity同用戶進(jìn)行長時(shí)間會(huì)話且可能一直處于活動(dòng)狀態(tài)。所以沒有必要去顯式地關(guān)閉返些組件。 關(guān)閉組件 content provider 僅在響應(yīng)來自 ContentResolver 的請(qǐng)求時(shí)處于活動(dòng)狀態(tài)。 3 應(yīng)用程序可以通過傳遞一個(gè) Intent 對(duì)象至 () ,Context. sendOrderedBroadcast(), 以及 ()和其它類似方法來發(fā)起一個(gè)廣播。這個(gè) activity可以調(diào)用 bindService()來建立此連接,然后調(diào)用 service 中定之的方法來控制回放。此 service 會(huì)通過 onBind() 方法的調(diào)用來獲取此 Intent 對(duì)象(如果此 service 尚未運(yùn)行, bindService()會(huì)先啟動(dòng)它)。 Android 調(diào)用此 service 的 onStart()方法并將Intent 對(duì)象傳遞給它。其結(jié)果將會(huì)被封裝在一個(gè) Intent 對(duì)象中,并傳遞給發(fā)出調(diào)用的 activity的onActivityResult() 方法。如果它期望它所啟動(dòng)的那個(gè) activity迒回一個(gè)結(jié)果,它會(huì)調(diào)用 startActivityForResult()而不是 startActivity()。 Android 通過調(diào)用 activity的 onNewIntent()方法來傳遞給它隨后的任何長春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 12 intent。 對(duì)于每種組件來說,激活的方法是不同的: 1 通過傳遞一()(以啟動(dòng)(或指定新工作給)一個(gè) activity。而對(duì)于 broadcast receiver 來說, Intent 對(duì)象指明了所通報(bào)的操作。 對(duì)于 activity和 service 來說,它指明了所請(qǐng)求的操作名稱,并指定了用來操作的數(shù)據(jù)的 URI 和其它一些信息。而其它三種組件 ——activity、 service 和 broadcast receiver,被一種叫做 intent 的異步消息所激活。 每當(dāng)出現(xiàn)一個(gè)需要被特定組件處理的請(qǐng)求時(shí), Android 會(huì)確保那個(gè)組件的應(yīng)用程序進(jìn)程處于運(yùn)行狀態(tài),必要時(shí)會(huì)啟動(dòng)它,并確保那個(gè)組件的一個(gè)合適的實(shí)例可用,必要時(shí)會(huì)創(chuàng)建那個(gè)實(shí)例。 ContentResolver 可以與任何 content provider 進(jìn)行會(huì)話;與其合作對(duì)任何相關(guān)的進(jìn)程間通訊進(jìn)行管理。 content provider 繼承于ContentProvider 基類,實(shí)現(xiàn)了一套使得其他應(yīng)用程序能夠檢索和存儲(chǔ)它所管理的類型數(shù)據(jù)的標(biāo)準(zhǔn)方法。 4 Content provider content provider 將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。通知可以用多種方式來吸引用戶的注意力──閃動(dòng)背光燈、震動(dòng)設(shè)備、播放聲音等等。 broadcast receiver 沒有用戶界面。 一個(gè)應(yīng)用程序可以擁有任意數(shù)量的 broadcast receiver,以對(duì)所有它認(rèn)為重要的通知信息予以響應(yīng)。許多廣播是由系統(tǒng)代碼產(chǎn)生的 ——例如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項(xiàng)。參見稍后的進(jìn)程和線程。 如同 activity和其它組件一樣, service 運(yùn)行于應(yīng)用程序進(jìn)程的主線程內(nèi)。連接之后,你可以通過那個(gè) service 暴露出來的接口不 service 進(jìn)行通訊。系統(tǒng)將在這個(gè) activity不再顯示于屏幕乀后,仍維持音樂播放 service 的運(yùn)行。然而,音樂播放這個(gè)任務(wù)本身丌應(yīng)該由任何 activity來處理,因?yàn)橛脩羝谕词乖谒麄冸x開播放器應(yīng)用程序而開始做別的事情時(shí),音樂仍在繼續(xù)播放。 一個(gè)媒體播放器播放播放列表中的曲目是一個(gè)不錯(cuò)的例子。例如,一 個(gè)service 可以在用戶做其它事情的時(shí)候在后臺(tái)播放背景音樂、從網(wǎng)絡(luò)上獲取數(shù)據(jù)或者計(jì)算一些東西并提供給需要這個(gè)運(yùn)算結(jié)果的 activity使用。(參見獨(dú)立的用戶界面文檔以獲取關(guān)于 view 及層次結(jié)構(gòu)的更多信息。 view 層次結(jié)構(gòu)是由 () 方法放入 activity的窗口之中的。例如, view 可以顯示一個(gè)小圖片,并在用戶指點(diǎn)它的時(shí)候產(chǎn)生動(dòng)作。葉節(jié)點(diǎn) view(位于層次結(jié)構(gòu)最底端)在它們控制的矩形區(qū)域中進(jìn)行繪制,并對(duì)用戶直達(dá)其區(qū)域的操作做出響應(yīng)。每個(gè) view 均控制著窗口中一塊特定的矩形區(qū)域。一個(gè) activity也可以使用附加窗口 ——例如,一個(gè)在 activity運(yùn)行過程中彈出的供用戶響應(yīng)的對(duì)話框,戒是一個(gè)當(dāng)用戶選擇了屏幕上特定項(xiàng)目后顯示的必要信息的窗口。 每個(gè) activity都被給予一個(gè)默認(rèn)的窗口以進(jìn)行繪制。一般情況下,總有一個(gè)應(yīng)用程序被標(biāo)記為用戶在應(yīng)用程序啟動(dòng)的時(shí)候第一個(gè)看到的。 一個(gè)應(yīng)用程序可以只有一個(gè) activity,戒者,如剛才提到的短信應(yīng)用程序那樣,包含很多個(gè)。盡管它們一起組成了一個(gè)內(nèi)聚的用戶界面,但其中每個(gè) activity都不其它的保持獨(dú)立。例如,一個(gè) activity可以展示一個(gè)菜單項(xiàng)列表供用戶選擇,戒者顯示一些包含說明文字的照片。因此,不像其它大多數(shù)系統(tǒng)上的應(yīng)用程序, Android 應(yīng)用程序并沒有為應(yīng)用程序提供一個(gè)單獨(dú)的入口點(diǎn) (比如說,沒有 main()函數(shù)),而是為系統(tǒng)提供了可以實(shí)例化和運(yùn)行所需的必備組件。它只是在有需求的時(shí)候啟動(dòng)了其它應(yīng)用程序的那個(gè)功能部分。例如,如果你的應(yīng)用程序需要顯示一個(gè)圖片卷動(dòng)列表,而另一個(gè)應(yīng)用程序已經(jīng)開發(fā)了一個(gè)合用的而又允許別的應(yīng)用程序使用的話,你可以直接調(diào)用那個(gè)卷動(dòng)列表來完成工作,而不用自己再開發(fā)一個(gè)。 3 默認(rèn)情況下,每個(gè)應(yīng)用程序均被賦予一個(gè)唯一的 Linux用戶 ID,并加以權(quán)限設(shè)置,使得應(yīng)用程序的文件僅對(duì)此用戶及此應(yīng)用程序可見 ——盡管也有其它的方法使得這些文件同樣能為其他應(yīng)用程序所訪問。當(dāng)應(yīng)用程序中的任何代碼需 要被執(zhí)行時(shí), Android 啟動(dòng)此進(jìn)程,而當(dāng)不再需要此進(jìn)程并且其它應(yīng)用程序又請(qǐng)求系統(tǒng)資源時(shí),則關(guān)閉這個(gè)進(jìn)程。單一 .apk文件中的所有代碼被認(rèn)為是一個(gè)應(yīng)用程序。 aapt 工具把編譯后的 Java 代碼連同應(yīng)用程序所需的其他數(shù)據(jù)和資源文件一起打包到一個(gè) Android 包文件中,這個(gè)文件使用 .apk作為擴(kuò)展名。t have any filters, it can be activated only by intents that explicitly name the ponent as the target. 長春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 8 For a broadcast receiver that39。re declared in the manifest file. Here39。s ponents. For example, an activity might be declared as follows: The name attribute of the activity element names the Activity subclass that implements the activity. The icon and label attributes point to resource files containing an icon and label that can be displayed to users to represent the activity. The other ponents are declared in a similar way — service elements for services, receiver elements for broadcast receivers, and provider elements for content providers. Activities, services, and content providers that are not declared in the manifest are not visible to the system and are consequently never run. However, broadcast receivers can either be declared in the manifest, or they can be created dynamically in code (as BroadcastReceiver objects) and registered