日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

發(fā)布時間:2025/3/8 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文首發(fā)于微信公眾號「后廠技術(shù)官」

在上一篇文章Android IPC機制(二)用Messenger進行進程間通信中我們介紹了使用Messenger來進行進程間通信的方法,但是我們能發(fā)現(xiàn)Messenger是以串行的方式來處理客戶端發(fā)來的信息,如果有大量的消息發(fā)到服務(wù)端,服務(wù)端仍然一個一個的處理再響應(yīng)客戶端顯然是不合適的。另外,Messenger用來進程間進行數(shù)據(jù)傳遞但是卻不能滿足跨進程的方法調(diào)用,接下來我們來使用AIDL來實現(xiàn)跨進程方法調(diào)用,此前我們都是用Eclipse來實現(xiàn)的,這次我們看看在Android Studio中使用AIDL有什么不同。

1. 創(chuàng)建AIDL文件

我們將項目的目錄結(jié)構(gòu)調(diào)為Android模式,在java同級目錄創(chuàng)建aidl文件夾,在文件夾中創(chuàng)建一個包名和應(yīng)用包名一致的包

我們先創(chuàng)建一個IGameManager.aidl的文件,這里面有兩個方法分別是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 支持

實現(xiàn)Parcelable接口的對象

所有AIDL接口

在IGameManager.aidl中我們用到了Game這個類,這個類實現(xiàn)了Parcelable,在AIDL 文件中我們要import 進來,來看看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);

}

}

在這里不去講怎么去實現(xiàn)Parcelable 接口,在上面的IGameManager.aidl文件中我們用到了Game這個類,所以我們也要創(chuàng)建Game.aidl,來申明Game實現(xiàn)了parcelable 接口。(Game.aidl)

package com.example.liuwangshu.moonaidl;

parcelable Game;

這個時候我們重新編譯程序,工程就會自動生成IGameManager.aidl對應(yīng)的接口文件,這個文件生成的位置和Eclipse的位置不同,我們將項目的目錄結(jié)構(gòu)調(diào)整為project模式,在app–>build–>generated–>soure–>aidl–>debug目錄下我們找到自己的包名文件,在文件中有一個接口文件IGameManager。

IGameManager接口文件的代碼這里就不說了,有興趣的可以下載本項目的源碼去了解下。

2. 創(chuàng)建服務(wù)端

服務(wù)端我們在onCreate方法中創(chuàng)建了兩個游戲的信息并創(chuàng)建Binder對象實現(xiàn)了AIDL的接口文件中的方法,并在onBind方法中將Binder對象返回。(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("大航海時代ol","最好玩的航海網(wǎng)游"));

}

@Override

public IBinder onBind(Intent intent){

return mBinder;

}

}

當(dāng)然我們不要忘了這個服務(wù)端應(yīng)該運行在另一個進程,在AndroidManifest.xml文件中配置service:

3. 客戶端調(diào)用

最后我們在客戶端onCreate方法中調(diào)用bindService方法綁定遠(yuǎn)程服務(wù)端,綁定成功后將返回的Binder對象轉(zhuǎn)換為AIDL接口,這樣我們就可以通過這個接口來調(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("月影傳說","最好玩的武俠單機游戲");

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)建了一個新的Game然后調(diào)用遠(yuǎn)程服務(wù)端的addGame方法將新游戲添加進去,然后調(diào)用循環(huán)將遠(yuǎn)端服務(wù)中的所有的游戲在打印出來,我們運行程序

打印出了遠(yuǎn)程服務(wù)端的所有的游戲,這樣我們就成功的在客戶端通過AIDL來調(diào)用遠(yuǎn)程服務(wù)端的方法了。

總結(jié)

以上是生活随笔為你收集整理的android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。