AIDL(每個(gè)程序都在自己的虛擬機(jī)中運(yùn)行的,為了保證數(shù)據(jù)的安全性,進(jìn)程間不能直接通信,基于Service的ADIL就像一個(gè)通信管道使進(jìn)程間可以通信)
跨進(jìn)程如何通訊
1.兩個(gè)進(jìn)程無法直接通信
2.通過Android系統(tǒng)底層鏈接進(jìn)行通信
基于Service的AIDL
AIDL基本理論
AIDL遠(yuǎn)程調(diào)用案例
AIDL原理簡(jiǎn)單剖析
Android Interface Definition Language
(android 接口定義語言)AIDL使用耗資源 占用內(nèi)存不要任意使用
通過IPC機(jī)制不同應(yīng)用程序訪問服務(wù)才用AIDL
IPC(進(jìn)程間通信)
AIDL 通過IPC讓多個(gè)應(yīng)用程序訪問你的服務(wù)
并且這個(gè)服務(wù)要處理多線程才有必要使用AIDL
Binder 只有IPC 沒有多線程 多個(gè)應(yīng)用程序
Message 只有IPC 沒有多線程
服務(wù)端Demo創(chuàng)建
1)創(chuàng)建aidl文件
1.java目錄右鍵下 new->folder->AIDL Folder
2.aidl 右鍵 aidl 文件 syncgradle
project視圖下面就會(huì)生成ImInterface 資源文件
這樣就可以在MainActivity中使用
兩個(gè)進(jìn)程通信要設(shè)定好規(guī)范:通過什么方法,傳入什么參數(shù),返回什么參數(shù)
接口定義 首字母每個(gè)開始首字母都要大寫
interface IMyAidl{
int add(int num1,int num2);//int 返回值 add方法,傳入Int類型參數(shù)
}
2)實(shí)現(xiàn)這個(gè)接口
public class IRemoteService extends Service{
public Ibinder onBind(Intent intent){
return null;
}
//當(dāng)客戶端綁定到這個(gè)服務(wù),就會(huì)返回iBinder,也就得到下面這個(gè)方法 實(shí)現(xiàn)Stub靜態(tài)內(nèi)部類(學(xué)會(huì)看API)
private IBinder iBiner=new IMyAidl.Stub(){
public int add(int num1,int num2) thrwos RemoteException{
log.d("Tag","收到了遠(yuǎn)程請(qǐng)求,輸入的參數(shù)是"+num1+"和"+num2)
return num1+num2;
}
}
}
服務(wù)端 三個(gè)文件 mainactivity IRemoteSevice實(shí)現(xiàn)方法onBind方法 得到Ibinder對(duì)象
.aidl 寫上規(guī)范
3)客戶端實(shí)現(xiàn)接口 必須一致(同意窗口 new 一個(gè)modle)
先新建AIDL 文件夾folder
再生成.aidl接口文件 IMyAidl 名字必須一致
oncreate(){...
initView();
//軟件已啟動(dòng)就綁定
bindService();
}
綁定服務(wù)
//Android 5.0不允許隱士方式啟動(dòng)服務(wù),必須明文標(biāo)示那個(gè)服務(wù)
//顯示Intent 綁定服務(wù)
選中內(nèi)容 control+alt+m 封裝成新方法
private void bindService(){
Intent intent=new Intent();
intent.setComponent(new Compentname("com.imy.aidl","com.imy.aidl. IRemoteService"));
//包名加類名
bindService(intent,conn,Context.BIND_AUTO_CREATE);
//三個(gè)參數(shù) 1.intent 2.service connection 3.flag 表示綁定時(shí)自動(dòng)啟動(dòng)service
}
學(xué)會(huì)使用快捷鍵 alter+enter(本例中提示conn錯(cuò)誤)
選中conn alt+enter 生成這個(gè)connection
mainActivity中:
IMyAidl adil;
private ServiceConnection conn=new ServiceConnection(){
//綁定上服務(wù)時(shí)
public void onServiceConnected(ComponentName name,IBindle service){
//拿到了遠(yuǎn)程的資源,實(shí)質(zhì)上就是服務(wù)端的binder通過該方法獲得
aidl=IMyAidl.Stub.asInterface(service);
}
public void onServiceDisConnected(ComponentName name,IBindle service){
//回收資源不至于泄露內(nèi)存
aidl=null;
}
}}
onClick(){
try{
//調(diào)用遠(yuǎn)程的服務(wù)
int res=aidl.add(num1,num2);//服務(wù)端獲取的那個(gè)
mEdit.setTex(res+"");
}catch{
}
}//改成
//APP銷毀的時(shí)候也要解綁定 必須的避免OOM
void Destroy(){
super.onDestory();
unbindService(conn);
}
也是三個(gè)文件