為了使其他的應(yīng)用程序也可以訪問(wèn)本應(yīng)用程序提供的服務(wù),Android系統(tǒng)采用了遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)方式來(lái)實(shí)現(xiàn)。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語(yǔ)言(Interface Definition Language,IDL)來(lái)公開服務(wù)的接口。因此,可以將這種可以跨進(jìn)程訪問(wè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è)簡(jiǎn)單的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ú)法獲得服務(wù)對(duì)象。
(4)在AndroidManifest.xml文件中配置MyService類,代碼如下:
其中"cn.m9.activity.IMyService"是客戶端用于訪問(wèn)AIDL服務(wù)的ID。
下面來(lái)編寫客戶端的調(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方法來(lái)綁定AIDL服務(wù)。其中需要使用Intent對(duì)象指定AIDL服務(wù)的ID,也就是標(biāo)簽中android:name屬性的值。
在綁定時(shí)需要一個(gè)ServiceConnection對(duì)象。創(chuàng)建ServiceConnection對(duì)象的過(guò)程中如果綁定成功,系統(tǒng)會(huì)調(diào)用onServiceConnected方法,通過(guò)該方法的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方法的返回值.
找到桌面上的設(shè)置按鈕或下滑通知欄右上方的設(shè)置按鈕。進(jìn)入設(shè)......
閱讀soul的聊天記錄刪除后是無(wú)法恢復(fù)的,由于soul的聊天記錄都會(huì)保......
閱讀花唄收款二維碼可以商家服務(wù)頁(yè)面選項(xiàng)中找到,但是先需要開通......
閱讀微信刪除的賬單是不可以恢復(fù)的,當(dāng)刪除賬單的時(shí)候,會(huì)提示刪......
閱讀顯示tim移動(dòng)在線是手機(jī)上使用了TIM版本的QQ登錄的賬號(hào),所以會(huì)......
閱讀華碩ZenFone AR多少錢?大家是不是也想知道呢?那么華碩ZenFone AR配置怎么樣呢?下面大家和出來(lái)小豆子一起來(lái)了解。...
次閱讀
恢復(fù)目錄功能。勾上要恢復(fù)的目錄和文件,點(diǎn)恢復(fù)數(shù)據(jù)按鈕,就可以把數(shù)據(jù)恢復(fù)到別的盤里面。 如果要恢復(fù)單個(gè)文件,在列表中右鍵點(diǎn)中一個(gè)文件,菜單選恢復(fù)當(dāng)前選中的文件 請(qǐng)選擇...
次閱讀
安卓手機(jī)鎖屏密碼忘記了怎么辦?如何用adb解鎖手機(jī)鎖屏 ? 今天教大家用ADB來(lái)刪除密碼 下載地址:http://www.pc6.com/softview/SoftView_65436.html 1.手機(jī)連接電腦,在充電模式下進(jìn)行。 2.下載ADB解...
次閱讀
2015年8月2500元左右的安卓智能手機(jī)推薦,很早以前,要是讓你在洋品牌和自主品牌之間選擇,相信大部分人會(huì)毫不猶豫的選擇前者,因?yàn)槟菚r(shí)國(guó)內(nèi)手機(jī)廠商在制作工藝方面與洋品牌相差...
次閱讀
另外有朋友反映說(shuō),手機(jī)QQ安卓版的自動(dòng)登錄密碼,會(huì)在重啟手機(jī)后無(wú)故丟失,關(guān)于這個(gè)問(wèn)題我也遇到過(guò),但是具體的原因不明,這里推測(cè)一下僅供參考,手機(jī)關(guān)機(jī)時(shí),QQ還在后臺(tái)運(yùn)行,...
次閱讀
Q:Android 5.0關(guān)屏動(dòng)畫與以前有什么不同? A:Android 5.0已經(jīng)發(fā)布,這次的安卓系統(tǒng)跟以往有著很大的不同,可以說(shuō)是谷歌對(duì)于安卓系統(tǒng)的一次跨越,那么Android 5.0關(guān)屏動(dòng)畫與以前有什么不同...
次閱讀
小米max2新特性是什么?相信很多米粉對(duì)于小米max2的新特性很期待,下文帶來(lái)小米max2新功能大全,一起和小樂(lè)哥來(lái)了解下吧!...
次閱讀
第一步:首先我們找到桌面上的相機(jī)圖標(biāo),點(diǎn)擊相機(jī) 第二步:進(jìn)入到相機(jī)頁(yè)面,我們用手向右滑動(dòng) 第三步:選擇倒計(jì)時(shí)拍照, 第四步:我們發(fā)現(xiàn)在屏幕的下方出現(xiàn)了倒計(jì)時(shí)的選項(xiàng),里...
次閱讀
樓主你好!我知道紅米2怎么設(shè)置鎖屏密碼,快來(lái)看一下吧。 1)打開紅米2手機(jī)點(diǎn)擊設(shè)置進(jìn)入,然后再點(diǎn)擊【鎖屏和密碼】,進(jìn)入后再點(diǎn)擊【屏幕密碼】;(如下圖) 2)進(jìn)入設(shè)置鎖界面繪制【鎖...
次閱讀
GPS數(shù)據(jù)怎么用? 小編首先可能要提醒大家,很多人可能在使用的時(shí)候,手機(jī)是沒(méi)有辦法顯示,其他最簡(jiǎn)單的原因就是沒(méi)有打開GPS定位,請(qǐng)先看2張比較圖: 小編這里可以顯示19顆衛(wèi)星的,...
次閱讀
ofo公主車怎么樣?好騎嗎?大家是不是也想知道ofo小黃車公主車在哪里呢?那么下面綠茶小豆子為大家詳細(xì)ofo公主車位置!...
次閱讀
1)下拉通知欄,按住【GPS定位】進(jìn)入設(shè)置,在設(shè)置界面點(diǎn)擊【其他系統(tǒng)設(shè)置】。(如下圖) 2)點(diǎn)擊【位置信息】進(jìn)入,打開【開啟位置服務(wù)】右邊按鈕即可。(如下圖)...
次閱讀
么么噠品牌旗下的首款手機(jī)----么么噠3S最大的一個(gè)賣點(diǎn)莫過(guò)于加入了眼紋識(shí)別功能,大家只需錄入眼紋信息,便可實(shí)現(xiàn)眼紋解鎖,使用十分快捷方便。相信大家對(duì)眼紋識(shí)別不會(huì)感到陌生...
次閱讀
許多安卓手機(jī)用戶都會(huì)發(fā)現(xiàn),每次安裝安卓手機(jī)軟件時(shí),都會(huì)彈出許多惱人的廣告,那么,怎樣才能安裝軟件時(shí)去除廣告呢?以下就為大家?guī)?lái)安卓手機(jī)軟件中的廣告有效去除方法,具體...
次閱讀
1)點(diǎn)擊進(jìn)入華為榮耀4C的設(shè)置,選擇全部設(shè)置一欄,點(diǎn)擊【開發(fā)人員選項(xiàng)】進(jìn)入,找到并點(diǎn)擊【后臺(tái)進(jìn)程限制】。(注:開啟開發(fā)者選項(xiàng)請(qǐng)點(diǎn)擊相關(guān)教程)(如下圖) 2)根據(jù)自己的情況選擇進(jìn)...
次閱讀