為了使其他的應(yīng)用程序也可以訪問本應(yīng)用程序提供的服務(wù),Android系統(tǒng)采用了遠(yuǎn)程過程調(diào)用(Remote Procedure Call,RPC)方式來實(shí)現(xiàn)。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務(wù)的接口。因此,可以將這種可以跨進(jìn)程訪問的服務(wù)稱為AIDL(Android Interface Definition Language)服務(wù)。
android studio創(chuàng)建AIDL服務(wù)文件具體步驟如下:
1、要進(jìn)行創(chuàng)建AIDL的接口之前,需要進(jìn)行選中當(dāng)前的項(xiàng)目的文件中,選中完成項(xiàng)目之后。
2、然后進(jìn)行點(diǎn)擊Android studio菜單中的;file”的選項(xiàng),就會(huì)彈出了一個(gè)下拉的菜單中;new”選項(xiàng)。
3、就會(huì)彈出了一個(gè)下一級(jí)的菜單中,進(jìn)行選擇下一級(jí)菜單中的;AIDL”的選項(xiàng)。
4、就會(huì)彈出了一個(gè)菜單中,進(jìn)行點(diǎn)擊這個(gè)菜單中的;AIDL FILE”的選項(xiàng)。
5、就會(huì)彈出了一個(gè)AIDL的窗口的選項(xiàng),需要給接口進(jìn)行添加名稱,在interface name的輸入框中進(jìn)行輸入名稱,點(diǎn)擊”finish;的選項(xiàng)。
6、然后在項(xiàng)目中進(jìn)行天機(jī)了一個(gè)aidl的文件,在該文件下中,有一個(gè)aidl的后綴的文件,其實(shí)就是一個(gè)接口文件。
實(shí)例:
服務(wù)器端:
本例中將建立一個(gè)簡單的AIDL服務(wù)。這個(gè)AIDL服務(wù)只有一個(gè)getValue方法,該方法返回一個(gè)String類型的值。在安裝完服務(wù)后,會(huì)在客戶端調(diào)用這個(gè)getValue方法,并將返回值在TextView組件中輸出。建立這個(gè)AIDL服務(wù)的步驟如下:
(1)建立一個(gè)aidl文件。在Java包目錄中建立一個(gè)IMyService.aidl文件。IMyService.aidl文件的位置如圖所示。
IMyService.aidl文件的內(nèi)容如下:
package cn.m9.mobile.aidl;
interface IMyService {
String getValue;
}
IMyService.aidl文件的內(nèi)容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務(wù)不支持的數(shù)據(jù)類型(例如,InputStream、OutputStream)等內(nèi)容。
(2)如果IMyService.aidl文件中的內(nèi)容輸入正確,ADT會(huì)自動(dòng)生成一個(gè)IMyService.java文件。讀者一般并不需要關(guān)心這個(gè)文件的具體內(nèi)容,也不需要維護(hù)這個(gè)文件。
(3)編寫一個(gè)MyService類。MyService是Service的子類,在MyService類中定義了一個(gè)內(nèi)嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:
package cn.m9.mobile.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
public String getValue
{
return "Android is very powerful";
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyServiceImpl;
}
}
在編寫上面代碼時(shí)要注意如下兩點(diǎn):
IMyService.Stub是根據(jù)IMyService.aidl文件自動(dòng)生成的,一般并不需要管這個(gè)類的內(nèi)容,只需要編寫一個(gè)繼承于IMyService.Stub類的子類(MyServiceImpl類)即可。
onBind方法必須返回MyServiceImpl類的對(duì)象實(shí)例,否則客戶端無法獲得服務(wù)對(duì)象。
(4)在AndroidManifest.xml文件中配置MyService類,代碼如下:
其中"cn.m9.activity.IMyService"是客戶端用于訪問AIDL服務(wù)的ID。
下面來編寫客戶端的調(diào)用代碼。首先新建一個(gè)Eclipse Android工程(TestAidlClient),并將自動(dòng)生成的IMyService.java文件連同包目錄一起復(fù)制到 testAIDL_client工程的src目錄中(R文件除外).
調(diào)用AIDL服務(wù)首先要綁定服務(wù),然后才能獲得服務(wù)對(duì)象,代碼如下:
package cn.m9.mobile;
import cn.m9.mobile.R;
import cn.m9.mobile.aidl.IMyService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class TestAidlClient extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private static final String TAG="TestAIDLClient";
private ServiceConnection serviceConnection = new ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch (view.getId)
{
case R.id.btnBindAIDLService:
//綁定AIDL服務(wù)
bindService(new Intent("cn.m9.mobile.aidl.IMyService"), serviceConnection,Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try{
textView.setText(myService.getValue);
} catch (Exception e)
{
}
break;
}
}
}
在編寫上面代碼時(shí)應(yīng)注意如下兩點(diǎn):
使用bindService方法來綁定AIDL服務(wù)。其中需要使用Intent對(duì)象指定AIDL服務(wù)的ID,也就是標(biāo)簽中android:name屬性的值。
在綁定時(shí)需要一個(gè)ServiceConnection對(duì)象。創(chuàng)建ServiceConnection對(duì)象的過程中如果綁定成功,系統(tǒng)會(huì)調(diào)用onServiceConnected方法,通過該方法的service參數(shù)值可獲得AIDL服務(wù)對(duì)象。
首先運(yùn)行AIDL服務(wù)程序,然后運(yùn)行客戶端程序,單擊【綁定AIDL服務(wù)】按鈕,如果綁定成功,【調(diào)用AIDL服務(wù)】按鈕會(huì)變?yōu)榭蛇x狀態(tài),單擊這個(gè)按鈕,會(huì)輸出getValue方法的返回值.
如果你是剛接觸devc++這款開源工具的小伙伴,那么對(duì)于如何修改......
閱讀顯卡驅(qū)動(dòng)程序是電腦性能的核心組成部分之一,其正確的安裝直......
閱讀最近很多小伙伴發(fā)現(xiàn)win10帶有體驗(yàn)共享的功能,卻不知道這個(gè)功......
閱讀wps軟件是一款很不錯(cuò)的辦公軟件,是用戶辦公的好搭檔,因此......
閱讀我們?cè)谥匮bwin10系統(tǒng)的時(shí)候,有時(shí)候會(huì)碰到在重裝過程中一直轉(zhuǎn)......
閱讀re管理器是什么? re管理器又名RootExplorer,是一款高權(quán)限文件管理器,獲取Root權(quán)限后對(duì)系統(tǒng)文件進(jìn)行操作. 新建文件夾,查看/編輯文件,軟件安裝,RootExplorer具備普通文件管理器的各項(xiàng)基...
次閱讀
三星S6指紋識(shí)別設(shè)置方法。該功能可用于屏幕鎖定、網(wǎng)站登錄以及驗(yàn)證三星賬戶,在此之前您需要先注冊(cè)您的指紋信息,下面讓小編教大家三星S6指紋識(shí)別設(shè)置方法! 1)首先打開三星S6界面...
次閱讀
智能手機(jī)功能越來越多,安卓手機(jī)的花樣層出不窮,今天我們來看看怎么給你的寶貝手機(jī)更換字體!對(duì)于android手機(jī),美化的方式就更多了,我們先來了解一下如何給手機(jī)換個(gè)字體,是不...
次閱讀
1.在待機(jī)頁面下,點(diǎn)擊【應(yīng)用程序】。 2.點(diǎn)擊【設(shè)定】。 3.向上滑動(dòng)屏幕,點(diǎn)擊【電池】。 4.點(diǎn)擊屏幕右上角【更多】。 5.點(diǎn)擊【隱藏電池電量百分比】即可。 6.電池電量百分比已隱藏...
次閱讀
1 首先我們下載安裝 ons模擬器 文件,apk格式,直接安裝即可。如圖: 2 然后我們下載各種ons游戲,一般ons游戲都是一個(gè)壓縮包,我們將下載下來的游戲文件解壓,然后拷貝到手機(jī)上(這...
次閱讀
OPPO R7怎么插卡?R7怎么裝SIM卡?入手OPPO R7第一件要做的事就是插卡了,如果你不知道R7怎么插卡的話,不妨來看下小編的方法吧!希望此教程對(duì)大家有所幫助。 1)找到OPPO R7側(cè)邊的小孔,插入...
次閱讀
小米6亮銀探索版多少錢?大家是不是也想知道呢?那么下面綠茶小豆子為大家介紹小米6亮銀探索版價(jià)格。小米6亮銀探索版多少錢?...
次閱讀
這位親,很榮幸為你解答這個(gè)問題,來看看下面的教程吧。(^__^) 1)進(jìn)入手機(jī)界面點(diǎn)擊設(shè)置后再點(diǎn)擊【其他連接方式】;(如下圖) 2)進(jìn)入后再點(diǎn)擊【網(wǎng)絡(luò)共享】;(如下圖) 3)然后點(diǎn)擊【USB共享...
次閱讀
打開小米Note【安全中心】,找到并點(diǎn)擊【聯(lián)網(wǎng)控制】,根據(jù)所需控制聯(lián)網(wǎng)應(yīng)用就行。PS:一般控制【數(shù)據(jù)】流量即可。(如睛圖) 注 :更多精彩教程請(qǐng)關(guān)注 手機(jī)教程 欄目,手機(jī)數(shù)碼群:...
次閱讀
螞蟻花唄和分期購的區(qū)別是什么?相信很多用戶對(duì)于這種支付方式還不是很清楚,那么分期購和螞蟻花唄哪個(gè)好呢?下文小樂哥給大家介紹一下!...
次閱讀
cmwap和cmnet是GPRS網(wǎng)絡(luò)的兩種接入方式。其實(shí)上是wap方式和net方式。cm是chinamobile(中國移動(dòng))。很 多人都知道這是中國移動(dòng)提供的兩個(gè)不同的接入點(diǎn),但是說到區(qū)別,恐怕很多玩家都不是十...
次閱讀
基帶:Baseband 信源(信息源,也稱發(fā)終端)發(fā)出的沒有經(jīng)過調(diào)制(進(jìn)行頻譜搬移和變換)的原始電信號(hào)所固有的頻帶(頻率帶寬),稱為基本頻帶,簡稱基帶。不同的基帶你可以把它想象成調(diào)頻收音機(jī)的...
次閱讀
微信深色模式跟隨系統(tǒng)開關(guān)在哪設(shè)置微信深色模式早已經(jīng)更新,玩家們可以自由設(shè)置深色模式的開啟,在深色模式中有一個(gè)跟隨系統(tǒng),有些用戶想要關(guān)閉跟隨系統(tǒng),但是不知道怎么設(shè)置,下面小...
次閱讀
問:安卓手機(jī)怎么重命名桌面上的文件夾? 答:那么安卓手機(jī)怎樣將文件夾重命名呢?單擊打開文件夾按住文件夾的標(biāo)題欄,即可出現(xiàn)重命名對(duì)話框。...
次閱讀
1)進(jìn)入X5Max的設(shè)置界面,點(diǎn)擊【單手操作】,開啟【手勢(shì)調(diào)出小屏】右邊按鈕。(如下圖) 2)回到主界面向屏幕內(nèi)滑動(dòng),再滑出屏幕邊緣外即可。(如下圖)...
次閱讀