@ 每個(gè)繼承擁有自己的虛擬機(jī),所以程序間的運(yùn)行是互相隔離的。
@ 默認(rèn)情況下,每個(gè)應(yīng)用程序都會(huì)分到一個(gè)特殊的Linux用戶ID,并被設(shè)置權(quán)限,只對(duì)應(yīng)用程序自己可見和使用,當(dāng)然可以對(duì)其他程序開放。
可以安排兩個(gè)程序共享一個(gè)UserID,這樣他們可以互相看到對(duì)方的文件,共享系統(tǒng)資源,并且在同一個(gè)Linux線程里運(yùn)行,共享虛擬機(jī)。
Android的一個(gè)核心特點(diǎn)就是一個(gè)應(yīng)用程序可以由其他應(yīng)用程序的組件來組成(在其他程序允許的前提下)。例如:如果你的程序需要顯示一個(gè)圖片列表并且另一個(gè)程序已經(jīng)開發(fā)了合適的滾動(dòng)條且允許其 他應(yīng)用程序添加,那么你可以在他的滾動(dòng)條基礎(chǔ)上開發(fā),比自己開發(fā)要方便的多。你的程序不需要合并他的代碼只需要一個(gè)連接即可。相比之下,當(dāng)我需要某個(gè)程序然后可以啟動(dòng)他時(shí)是最簡單的。
想要這樣的話,當(dāng)這個(gè)程序的某一部分被別人用到時(shí),系統(tǒng)必須能都啟動(dòng)一個(gè)應(yīng)用程序的進(jìn)程,并且實(shí)例化這些相關(guān)的Java對(duì)象,因此,與其他系統(tǒng)的應(yīng)用程序不同的是,android程序沒有一個(gè)單一的入 口程序(例如main方法),相比下,android有四種基本的組件可以被系統(tǒng)實(shí)例化、啟動(dòng)。包括:Activities、Services、Broadcast receivers、Content providers。
Activity提供了一個(gè)可視化的用戶接口,例如:一個(gè)activity可以提供一個(gè)列表,供用戶選擇,或者在拍照時(shí)顯示照片列表。一個(gè)短信程序有一個(gè)activity顯示聯(lián)系人列表,另一個(gè)activity可以寫短信 并且選擇聯(lián)系人發(fā)送,別的activity可以查看以往的短信內(nèi)容并且更改設(shè)置。這幾個(gè)activity共同在一個(gè)用戶界面里發(fā)揮著作用,他們之間互相依賴,每一個(gè)都是繼承自activity基類的子類。
一個(gè)應(yīng)用程序可以包含一個(gè)或者多個(gè)activity,例如剛提到的短信程序。需要多少就可以包含多少。通常,被標(biāo)記的第一個(gè)activity先運(yùn)行。當(dāng)前activity啟動(dòng)完就啟動(dòng)下一個(gè)。
每個(gè)activity都被分配一個(gè)默認(rèn)的窗口來繪制。通常是全屏,也可以比屏幕小或者浮在其他窗口上。一個(gè)activity可以利用額外的窗口,例如:在activity里探出一個(gè)讓用戶想用的彈出對(duì)話框,或者顯 示一個(gè)給用戶顯示重要信息供用戶選擇的特殊選項(xiàng)。
窗口的可視內(nèi)容由層式結(jié)構(gòu)的view來顯示,他們繼承自view基類。每個(gè)view控制一個(gè)特定矩形空間內(nèi)的窗口。父view控制并且組織子view 的顯示。子view(上層的view)被繪制在矩形里響應(yīng)用戶的操作 ,從而與用戶交互信息。例如可以顯示一副小圖片用戶點(diǎn)擊圖片時(shí)響應(yīng)一個(gè)事件。Android有很多現(xiàn)成的view可以被直接使用,包括按鈕、文本框、滾動(dòng)條、菜單、選擇框等等。
通過Activity.setContentView()可以改變activity的顯示,content view 是根視圖。
servers沒有用戶接界面,但它確實(shí)在后臺(tái)不定期的運(yùn)行著。例如:但用戶處理其他事情時(shí),一個(gè)service可以背景播放音樂、后臺(tái)讀取網(wǎng)絡(luò)數(shù)據(jù)或者處理其他的東西并且提供給其他的activity,每一個(gè) servers都繼承自Service基類。
一個(gè)最好的例子就是媒體播放器。播放器大概需要一個(gè)或多個(gè)activity來允許用戶選擇歌曲并且播放。然而,播放器不必是當(dāng)前
活動(dòng)的activity,用戶可能在播放時(shí)做別的事情。播放器需要啟動(dòng)一個(gè)后 臺(tái)來持續(xù)播放音樂。系統(tǒng)會(huì)一直播放這個(gè)播放器service甚至當(dāng)他隱藏時(shí)。
我們可以鏈接到一個(gè)正在運(yùn)行的service,或者啟動(dòng)一個(gè)沒有運(yùn)行的service,當(dāng)連接成功時(shí),你可以和service的進(jìn)程通信。例如播放器,用戶可以控制他的開始暫停重放等功能。
像activity和其他的組件一樣,services運(yùn)行在主線程。所以不會(huì)阻塞其他的組件或者用戶界面。他們往往啟動(dòng)一個(gè)新的任務(wù)??蓞⒖糚rocess and Threads。
Broadcast receiver這個(gè)組件只是接受receive和響應(yīng)Broadcast廣播通知。很多廣播來源系統(tǒng)代碼,例如通知時(shí)區(qū)已經(jīng)改變、低電量、圖片被選中、用戶改變了語言設(shè)置,此時(shí)用戶開始廣播,例如,同 事其他應(yīng)用程序網(wǎng)絡(luò)數(shù)據(jù)已經(jīng)下載ok可以使用了。
一個(gè)Broadcast receiver 可以響應(yīng)多個(gè)廣播,所有的Broadcast receiver 都繼承自BroadcastReceiver基類。
Broadcast receivers 沒有用戶界面。然而,他們可以在接收到消息啟動(dòng)一個(gè)activity,或者使用notificationManager 去提醒用戶。Notifications 可以通過一些方式引起用戶注意:閃動(dòng)背光、 震動(dòng)、發(fā)聲等等。通常在狀態(tài)欄顯示一個(gè)提示圖標(biāo)讓用戶可以查看。
Content providers為其他程序提供數(shù)據(jù)集,這些數(shù)據(jù)可以保存在系統(tǒng)文件里或者sqlite數(shù)據(jù)庫里,Content providers繼承自 ContentProvider基類,實(shí)現(xiàn)了一些標(biāo)準(zhǔn)的方法,可以 讓程序檢索或者改寫其中的數(shù)據(jù)。程序不能直接的調(diào)用那些方法。ContentResolver不能與content provider直接通信,但可以用過ContentResolver 。ContentResolver 可以跟任何的content provider通信,可以與provider合作管理通 信進(jìn)程。
更多信息查看Content Providers文檔。
當(dāng)有需要特定的請(qǐng)求需要被處理時(shí),Android都會(huì)確保他正在運(yùn)行,需要時(shí)會(huì)創(chuàng)建一個(gè)實(shí)例。