有關(guān)Android調(diào)用服務(wù)全解析
進(jìn)行Android調(diào)用服務(wù)時(shí),你的程序只需要建立一個(gè)intent對(duì)象,這個(gè)intent對(duì)象包含請(qǐng)求的數(shù)據(jù),并調(diào)用startActivity(),當(dāng)前的acitivity被彈出棧,之前的activity成為正在運(yùn)行的。
被激活的activity可以通過調(diào)用 getIntent() 方法獲取激活它的intent。Android調(diào)用服務(wù)acitivity的onNewIntent() 方法來(lái)傳送其他后來(lái)的intent。(注:一個(gè)activity可以同時(shí)被多個(gè)intent激活)Activity經(jīng)常會(huì)調(diào)用其他的activity,如果它需要被調(diào)用的activity返回的數(shù)據(jù),可以調(diào)用startActivityForResult() 方法,而不是 startActivity()。
例如,某個(gè)activity調(diào)用另外一個(gè)activity用來(lái)讓用戶選擇一個(gè)圖片,另外一個(gè)activity應(yīng)該返回用戶選擇的圖片。結(jié)果通過第一個(gè)activity的onActivityResult() 返回,返回的形式也是intent。service通過調(diào)用 Context.startService()被開始。Android調(diào)用服務(wù)的onStart() 方法,并把intent傳送給它。
類似的,intent可以通過 Context.bindService() 方法建立同正在運(yùn)行的服務(wù)的聯(lián)系。服務(wù)通過onBind() 方法獲取intent。如果服務(wù)沒有啟動(dòng), bindService() 方法可以選擇是否啟動(dòng)服務(wù)。例如,一個(gè)activity可能會(huì)想建立與后臺(tái)播放音樂的服務(wù)的通信。
這樣用戶就可以通過activity控制后臺(tái)的播放。因此activity可能會(huì)調(diào)用 bindService() 方法來(lái)建立連接,然后再調(diào)用service公開的接口。程序可以調(diào)用Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和Context.sendStickyBroadcast()來(lái)傳遞intent初始化一個(gè)broadcast。broadcast 通過 onReceive() 方法接收。
在Android開始一個(gè)應(yīng)用程序之前,它必須知道有哪些文件,因此程序必須在一個(gè)manifest文件中聲明所有用到的組件。這些聲明的組件會(huì)被編譯到apk文件中。.apk 文件含有程序源代碼和資源。
(注:相當(dāng)于項(xiàng)目文件)裝箱單是一個(gè)xml文件,在所有的程序中命名都是AndroidManifest.xml 。它還有一些其他 的功能,如:指明需要連接的庫(kù)、識(shí)別程序希望被授予的權(quán)限。
但是裝箱單的主要任務(wù)還是向android聲明程序的組件。一份裝箱單的例子:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest . . . >
- <application . . . >
- <activity android:name="com.example.project.FreneticActivity"
- android:icon="@drawable/small_pic.png"
- android:label="@string/freneticLabel"
- . . . >
- </activity>
- . . .
- </application>
- </manifest>
<activity> 節(jié)點(diǎn)的name 屬性指明了 Activity 的類名. icon 和 label 屬性指明了展示activity時(shí)用到的資源。另一個(gè)節(jié)點(diǎn)的含義差不多 — <service> 是用來(lái)聲明services的, <receiver> 用來(lái)聲明broadtcast。
Android調(diào)用服務(wù)聲明 content providers. Activities, services。 content providers需要聲明,對(duì)系統(tǒng)不可見。另外, broadcast receivers可以不在裝箱單中聲明,可以動(dòng)態(tài)得在代碼中聲明。
(見BroadcastReceiver 對(duì)象)通過 Context.registerReceiver()方法向系統(tǒng)注冊(cè)。對(duì)用戶來(lái)說(shuō),即使地圖程序是定義在另外一個(gè)程序中、在另外一個(gè)進(jìn)程中運(yùn)行,但是它看起來(lái)好像你的程序的一部分。
Android通過將2個(gè)activities放在用一個(gè)任務(wù)中,使得用戶有這樣的體驗(yàn)。這一系列的activities,安排在一個(gè)堆棧中。堆棧中的根activity是任務(wù)的開始,或者說(shuō)是用戶選擇的應(yīng)用程序的第一個(gè)activity。堆棧頂部的activity 是當(dāng)前正在運(yùn)行的activity— 目前正在吸引用戶注意的一個(gè)。
當(dāng)一個(gè)activity啟動(dòng)另外一個(gè)的時(shí)候,新的activity被壓棧,變?yōu)楫?dāng)前activity. 之前的activity 還在任務(wù)中。當(dāng)用戶點(diǎn)擊后退(BACK)鍵,當(dāng)前的acitivity被彈出棧,之前的activity成為正在運(yùn)行的。
【編輯推薦】