android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...
本文首發(fā)于微信公眾號(hào)「后廠技術(shù)官」
在上一篇文章Android IPC機(jī)制(二)用Messenger進(jìn)行進(jìn)程間通信中我們介紹了使用Messenger來(lái)進(jìn)行進(jìn)程間通信的方法,但是我們能發(fā)現(xiàn)Messenger是以串行的方式來(lái)處理客戶端發(fā)來(lái)的信息,如果有大量的消息發(fā)到服務(wù)端,服務(wù)端仍然一個(gè)一個(gè)的處理再響應(yīng)客戶端顯然是不合適的。另外,Messenger用來(lái)進(jìn)程間進(jìn)行數(shù)據(jù)傳遞但是卻不能滿足跨進(jìn)程的方法調(diào)用,接下來(lái)我們來(lái)使用AIDL來(lái)實(shí)現(xiàn)跨進(jìn)程方法調(diào)用,此前我們都是用Eclipse來(lái)實(shí)現(xiàn)的,這次我們看看在Android Studio中使用AIDL有什么不同。
1. 創(chuàng)建AIDL文件
我們將項(xiàng)目的目錄結(jié)構(gòu)調(diào)為Android模式,在java同級(jí)目錄創(chuàng)建aidl文件夾,在文件夾中創(chuàng)建一個(gè)包名和應(yīng)用包名一致的包
我們先創(chuàng)建一個(gè)IGameManager.aidl的文件,這里面有兩個(gè)方法分別是addGame和getGameList。(IGameManager.aidl)
package com.example.liuwangshu.moonaidl;
import com.example.liuwangshu.moonaidl.Game;
interface IGameManager{
ListgetGameList();
void addGame(in Game game);
}
在AIDL文件中支持的數(shù)據(jù)類型包括:
基本數(shù)據(jù)類型
String和CharSequence
List:只支持ArrayList,里面的元素都必須被AIDL支持
Map:只支持HashMap,里面的元素必須被AIDL 支持
實(shí)現(xiàn)Parcelable接口的對(duì)象
所有AIDL接口
在IGameManager.aidl中我們用到了Game這個(gè)類,這個(gè)類實(shí)現(xiàn)了Parcelable,在AIDL 文件中我們要import 進(jìn)來(lái),來(lái)看看Game類。(Game.java)
package com.example.liuwangshu.moonaidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Game implements Parcelable{
public String gameName;
public String gameDescribe;
public Game(String gameName,String gameDescribe){
this.gameName=gameName;
this.gameDescribe=gameDescribe;
}
protected Game(Parcel in){
gameName=in.readString();
gameDescribe=in.readString();
}
public static final Creator CREATOR = new Creator() {
@Override
public Game createFromParcel(Parcel in){
return new Game(in);
}
@Override
public Game[] newArray(int size) {
return new Game[size];
}
};
@Override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags){
dest.writeString(gameName);
dest.writeString(gameDescribe);
}
}
在這里不去講怎么去實(shí)現(xiàn)Parcelable 接口,在上面的IGameManager.aidl文件中我們用到了Game這個(gè)類,所以我們也要?jiǎng)?chuàng)建Game.aidl,來(lái)申明Game實(shí)現(xiàn)了parcelable 接口。(Game.aidl)
package com.example.liuwangshu.moonaidl;
parcelable Game;
這個(gè)時(shí)候我們重新編譯程序,工程就會(huì)自動(dòng)生成IGameManager.aidl對(duì)應(yīng)的接口文件,這個(gè)文件生成的位置和Eclipse的位置不同,我們將項(xiàng)目的目錄結(jié)構(gòu)調(diào)整為project模式,在app–>build–>generated–>soure–>aidl–>debug目錄下我們找到自己的包名文件,在文件中有一個(gè)接口文件IGameManager。
IGameManager接口文件的代碼這里就不說(shuō)了,有興趣的可以下載本項(xiàng)目的源碼去了解下。
2. 創(chuàng)建服務(wù)端
服務(wù)端我們?cè)趏nCreate方法中創(chuàng)建了兩個(gè)游戲的信息并創(chuàng)建Binder對(duì)象實(shí)現(xiàn)了AIDL的接口文件中的方法,并在onBind方法中將Binder對(duì)象返回。(AIDLService.java)
package com.example.liuwangshu.moonaidl;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class AIDLService extends Service{
private CopyOnWriteArrayList mGameList=new CopyOnWriteArrayList();
private Binder mBinder= new IGameManager.Stub() {
@Override
public List getGameList() throws RemoteException{
return mGameList;
}
@Override
public void addGame(Game game) throws RemoteException{
mGameList.add(game);
}
};
@Override
public void onCreate(){
super.onCreate();
mGameList.add(new Game("九陰真經(jīng)ol", "最好玩的武俠網(wǎng)游"));
mGameList.add(new Game("大航海時(shí)代ol","最好玩的航海網(wǎng)游"));
}
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
}
當(dāng)然我們不要忘了這個(gè)服務(wù)端應(yīng)該運(yùn)行在另一個(gè)進(jìn)程,在AndroidManifest.xml文件中配置service:
3. 客戶端調(diào)用
最后我們?cè)诳蛻舳薿nCreate方法中調(diào)用bindService方法綁定遠(yuǎn)程服務(wù)端,綁定成功后將返回的Binder對(duì)象轉(zhuǎn)換為AIDL接口,這樣我們就可以通過(guò)這個(gè)接口來(lái)調(diào)用遠(yuǎn)程服務(wù)端的方法了。(AIDLActivity.java)
package com.example.liuwangshu.moonaidl;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class AIDLActivity extends AppCompatActivity{
private final static String TAG="AIDLActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidl);
Intent mIntent=new Intent(AIDLActivity.this,AIDLService.class);
bindService(mIntent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service){
IGameManager iGameManager=IGameManager.Stub.asInterface(service);
Game game=new Game("月影傳說(shuō)","最好玩的武俠單機(jī)游戲");
try {
iGameManager.addGame(game);
List mList=iGameManager.getGameList();
for(int i=0;i
Game mGame=mList.get(i);
Log.i(TAG,mGame.gameName+"---"+mGame.gameDescribe);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name){
}
};
@Override
protected void onDestroy(){
super.onDestroy();
unbindService(mServiceConnection);
}
}
綁定成功后我們創(chuàng)建了一個(gè)新的Game然后調(diào)用遠(yuǎn)程服務(wù)端的addGame方法將新游戲添加進(jìn)去,然后調(diào)用循環(huán)將遠(yuǎn)端服務(wù)中的所有的游戲在打印出來(lái),我們運(yùn)行程序
打印出了遠(yuǎn)程服務(wù)端的所有的游戲,這樣我們就成功的在客戶端通過(guò)AIDL來(lái)調(diào)用遠(yuǎn)程服務(wù)端的方法了。
總結(jié)
以上是生活随笔為你收集整理的android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 腾讯微加信用卡怎么激活
- 下一篇: 玖富万卡怎么退保费