新聞中心
在不同的進(jìn)程中, 如何實(shí)現(xiàn)傳遞對(duì)象呢? 顯然, Java中不允許跨進(jìn)程內(nèi)存共享, 因此傳遞對(duì)象, 只能把對(duì)象拆分成操作系統(tǒng)能理解的簡(jiǎn)單形式,有關(guān)Android接口的問(wèn)題下文進(jìn)行詳細(xì)說(shuō)明。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的青浦網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
以達(dá)到跨界對(duì)象訪問(wèn)的目的. 在J2EE中,采用RMI的方式, 可以通過(guò)序列化傳遞對(duì)象. 在Android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來(lái)卻比較麻煩.AIDL(AndRoid接口描述語(yǔ)言)是一種接口描述語(yǔ)言;
編譯器可以通過(guò)aidl文件生成一段代碼,通過(guò)預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要在一個(gè)Activity中, 訪問(wèn)另一個(gè)Service中的某個(gè)對(duì)象, 需要先將對(duì)象轉(zhuǎn)化成AIDL可識(shí)別的參數(shù)(可能是多個(gè)參數(shù)), 然后使用AIDL來(lái)傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對(duì)象.
AndRoid接口的IPC的機(jī)制和COM或CORBA類(lèi)似, 是基于接口的,但它是輕量級(jí)的。它使用代理類(lèi)在客戶(hù)端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關(guān)類(lèi).; 2. 調(diào)用aidl產(chǎn)生的class.
具體實(shí)現(xiàn)步驟如下:
1、創(chuàng)建AIDL文件, 在這個(gè)文件里面定義接口, 該接口定義了可供客戶(hù)端訪問(wèn)的方法和屬性。 如: ITaskBinder.adil
注意: 理論上, 參數(shù)可以傳遞基本數(shù)據(jù)類(lèi)型和String, 還有就是Bundle的派生類(lèi), 不過(guò)在Eclipse中,目前的ADT不支持Bundle做為參數(shù), 據(jù)說(shuō)用Ant編譯可以, 我沒(méi)做嘗試.
2、編譯AIDL文件, 用Ant的話(huà), 可能需要手動(dòng), 使用Eclipse plugin的話(huà),可以根據(jù)adil文件自動(dòng)生產(chǎn)java文件并編譯, 不需要人為介入.
3、在Java文件中, 實(shí)現(xiàn)AIDL中定義的接口. 編譯器會(huì)根據(jù)AIDL接口, 產(chǎn)生一個(gè)JAVA接口。這個(gè)接口有一個(gè)名為Stub的內(nèi)部抽象類(lèi)。它繼承擴(kuò)展了接口并實(shí)現(xiàn)了遠(yuǎn)程調(diào)用需要的幾個(gè)方法。接下來(lái)就需要自己去實(shí)現(xiàn)自定義的幾個(gè)接口了。
- package com.cmcc.demo;
- import com.cmcc.demo.ITaskCallback;
- interface ITaskBinder {
- boolean isTaskRunning();
- void stopRunningTask();
- void registerCallback(ITaskCallback cb);
- void unregisterCallback(ITaskCallback cb);
- }
- 其中: ITaskCallback在文件ITaskCallback.aidl中定義:
- package com.cmcc.demo;
- interface ITaskCallback {
- void actionPerformed(int actionId);
- }
- 注意: 理論上, 參數(shù)可以傳遞基本數(shù)據(jù)類(lèi)型和String, 還有就是Bundle的派生類(lèi), 不過(guò)在Eclipse中,目前的ADT不支持Bundle做為參數(shù), 據(jù)說(shuō)用Ant編譯可以, 我沒(méi)做嘗試.
- 2、編譯AIDL文件, 用Ant的話(huà), 可能需要手動(dòng), 使用Eclipse plugin的話(huà),可以根據(jù)adil文件自動(dòng)生產(chǎn)java文件并編譯, 不需要人為介入.
- 3、在Java文件中, 實(shí)現(xiàn)AIDL中定義的接口. 編譯器會(huì)根據(jù)AIDL接口, 產(chǎn)生一個(gè)JAVA接口。這個(gè)接口有一個(gè)名為Stub的內(nèi)部抽象類(lèi),它繼承擴(kuò)展了接口并實(shí)現(xiàn)了遠(yuǎn)程調(diào)用需要的幾個(gè)方法。接下來(lái)就需要自己去實(shí)現(xiàn)自定義的幾個(gè)接口了.
- ITaskBinder.aidl中接口的實(shí)現(xiàn), 在MyService.java中接口以?xún)?nèi)嵌類(lèi)的方式實(shí)現(xiàn):
- private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
- public void stopRunningTask() {
- //@TODO
- }
- public boolean isTaskRunning() {
- //@TODO
- return false;
- }
- public void registerCallback(ITaskCallback cb) {
- if (cb != null) mCallbacks.register(cb);
- }
- public void unregisterCallback(ITaskCallback cb) {
- if (cb != null) mCallbacks.unregister(cb);
- }
- };
- 在MyActivity.java中ITaskCallback.aidl接口實(shí)現(xiàn):
- private ITaskCallback mCallback = new ITaskCallback.Stub() {
- public void actionPerformed(int id) {
- //TODO
- printf("callback id=" + id);
- }
- };
4、向客戶(hù)端提供AndRoid接口ITaskBinder, 如果寫(xiě)的是service,擴(kuò)展該Service并重載onBind ()方法來(lái)返回一個(gè)實(shí)現(xiàn)上述接口的類(lèi)的實(shí)例。這個(gè)地方返回的mBinder,就是上面通過(guò)內(nèi)嵌了定義的那個(gè). (MyService.java)
【編輯推薦】
- 新一代的Android手機(jī)介紹 深度剖析Android SDK版本介紹
- 谷歌Android手機(jī)能否站穩(wěn)中國(guó)
- PythonAndroid深度剖析Android應(yīng)用程序的四種構(gòu)造塊
- 探秘與眾不同的Android系統(tǒng)?
當(dāng)前名稱(chēng):如何實(shí)現(xiàn)Android接口問(wèn)題
地址分享:http://m.fisionsoft.com.cn/article/djjhsij.html


咨詢(xún)
建站咨詢(xún)
