android studio 跨進程,Android IPC機制(三)在Android Studio中使用AIDL實現跨進程方法調用...

本文首發于微信公眾號「后廠技術官」

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

1. 創建AIDL文件

我們將項目的目錄結構調為Android模式,在java同級目錄創建aidl文件夾,在文件夾中創建一個包名和應用包名一致的包

6cd6e6ee4c5fdfa488b4251437b0ebcf.png

我們先創建一個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文件中支持的數據類型包括:

基本數據類型

String和CharSequence

List:只支持ArrayList,里面的元素都必須被AIDL支持

Map:只支持HashMap,里面的元素必須被AIDL 支持

實現Parcelable接口的對象

所有AIDL接口

在IGameManager.aidl中我們用到了Game這個類,這個類實現了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);

}

}

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

package com.example.liuwangshu.moonaidl;

parcelable Game;

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

2a2c65a24f2220ddf5cedec5fc101631.png

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

2. 創建服務端

服務端我們在onCreate方法中創建了兩個游戲的信息并創建Binder對象實現了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("九陰真經ol", "最好玩的武俠網游"));

mGameList.add(new Game("大航海時代ol","最好玩的航海網游"));

}

@Override

public IBinder onBind(Intent intent){

return mBinder;

}

}

當然我們不要忘了這個服務端應該運行在另一個進程,在AndroidManifest.xml文件中配置service:

3. 客戶端調用

最后我們在客戶端onCreate方法中調用bindService方法綁定遠程服務端,綁定成功后將返回的Binder對象轉換為AIDL接口,這樣我們就可以通過這個接口來調用遠程服務端的方法了。(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);

}

}

綁定成功后我們創建了一個新的Game然后調用遠程服務端的addGame方法將新游戲添加進去,然后調用循環將遠端服務中的所有的游戲在打印出來,我們運行程序

6720dd245100c32fa8e353519181ffa8.png

打印出了遠程服務端的所有的游戲,這樣我們就成功的在客戶端通過AIDL來調用遠程服務端的方法了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nubia ui 5.0 android,流暢度爆棚 搭Android 5.0系統新機一覽

近期各品牌新機都不少,而且90%以上都是Android系統的手機,可見安卓手機的主導地位仍在上升。而在系統層次,Android 5.0已經逐步開始普及,近期上市新機百分百均采用了這一系統,值得一提的是定制不再“深度”&#xff0c…

signature=4d4ce610ff2d4a5f2093452c24b70492,Reading Chromatin Signatures

摘要:The article cites a study which uses a combination of chromatin immunoprecipitation and microarray analysis to explore the histone modifications, transcription-factor binding and nucleosome density in 30 megabytes of human genome. It states…

html 百分比正方形,css實現未知寬度的正方形需求

今天群里有哥們問了一下,百分比寬度的正方形如何用css實現。其實就是不定寬的正方形如何用css實現。第一個方法利用圖片的等比例縮放,用base64寫一個1*1的透明png圖片,寬度100%,這樣容器就自動被撐成一個正方形,demo如…

html引用本地圖片不能是桌面的,Img標簽與本地文件:/// URL不顯示在Microsoft Edge Web瀏覽器...

在我的桌面應用程序中,我創建了一個臨時HTML文件(旨在讓用戶打印報告),然后通過默認顯示網頁瀏覽器。這個HTML文件保存在一個臨時文件夾,例如:C:/Users/UserName/AppData/Local/TempImg標簽與本地文件:/// URL不顯示在…

你用計算機做過什么事情,他偷偷干了什么?(電腦)

我一本正經地胡說一下吧。控制面板→管理工具”中找到的“事件查看器”,通過它可以了解系統的喜怒哀樂和一言一行事件查看器相當于一本厚厚的系統日志,可以查看關于硬件、軟件和系統問題的信息,也可以監視Windows XP的安全事件,下…

怎么用計算機算立方數,計算器的使用方法

計算器人們都很熟悉,尤其是從事數據行業的人更要懂得如何使用計算器,那么外行人士想要正確使用計算器該怎么辦呢?今天小編就來為您解圍。計算器包括標準型和科學型兩種,其中標準型使用方法如下:1、鍵入數字時,按下相應…

有計算機知識,計算機基本理論基礎知識總匯

計算機基本理論基礎知識總匯1、計算機按照數據處理規模大小可以分為(巨型計算機)(大型計算機)(小型計算機)(微型計算機)(工作站)等2、計算機的硬件主要由(控制器)(運算器)(存儲器)(輸入輸出設備)以及電源等硬件組成。3、計算機主機是(控制器)(運算器)(存儲器)的總稱&#xff0c…

麻省理工學院計算機科學與工程博士,2020年麻省理工學院博士讀幾年

麻省理工學院(Massachusetts Institute of Technology),簡稱麻省理工(MIT),坐落于美國馬薩諸塞州劍橋市(大波士頓地區) ,是世界著名私立研究型大學、被譽為"世界理工大學之最"。麻省理工學院博士讀幾年麻省理工學院博士一般讀5年&a…

廈門信息計算機專業錄取分數,廈門大學計算機類(含計算機科學與技術、智能科學與技術、網絡專業2016年在福建理科高考錄取最低分數線...

類似問題答案廈門大學計算機類(含計算機科學與技術、智能科學與技術、網絡專業2016年在北京理科...學校 地 區 專業 年份 批次 類型 分數 廈門大學 北京 計算機類(含計算機科學與技術、智能科學與技術、網絡 2016 一批 理科 650 學校 地 區 專業 年份 批次 類型 分數 廈門大學 …

遼寧412想學計算機科學技術,遼寧理工學院計算機科學與技術專業2016年在遼寧理科高考錄取最低分數線...

類似問題答案遼寧理工學院計算機科學與技術專業2016年在河北理科高考錄取最低分數線學校 地 區 專業 年份 批次 類型 分數 遼寧理工學院 河北 計算機科學與技術 2016 二批 理科 443 遼寧理工學院 河北 計算機科學與技術 2016 二批 理科 443 遼寧理工學院 河北 計算機科學與技術…

為什么計算機語言都是英語,編程為什么都是英語 編程為什么沒有漢語

編程為什么都是英語?編程為什么沒有漢語?一些想寫編程但英語又不好的同學想知道編程為什么都是英語,為什么沒有漢語,下面就讓小編為大家介紹一下其實是有漢語編程語言的,感興趣的小伙伴一起來看看吧,有一門…

學計算機隨隨便便上萬,大學“最燒錢”專業排行榜,“家境一般”慎入,“土豪”請隨意...

俗話說“高考七分考,三分報”,而這也意味著在高考當中不僅考試重要,在高考后的填報志愿也是非常重要的,因為填報志愿也代表著在大學期間學習什么專業,也代表著在畢業后會從事什么行業,所以報考專業一定要慎…

flash 用 html 播放,使用flash插件在HTML上播放音頻

原文鏈接:WordPress Audio Player 非插件方式使用方法Standalone versionThe standalone version comes with a JavaScript file to simplify configuring and embedding the player. This file includes theswfobject library.Note: the zip file includes two oth…

蘇大計算機學院在哪,蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?...

原標題:蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?一個朋友問我這么一個問題:“蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?”經常看到這么一句話…

科學計算機fx-82es,fx-82ES PLUS A -2卡西歐計算器-計算器 函數科學-卡西歐官方商城...

卡西歐官方商城只接受來自中國大陸地區的訂單,訂單配送范圍僅限中國大陸地區。發貨時間1.普通商品訂單:周一至周日均可發貨。當天17:00前的訂單可當天安排發貨,17:00后的訂單則第二天安排發貨。如遇量大及大型活動期間…

計算機技術博客博客知乎,我的技術博客的選擇:CSDN、博客園、簡書、知乎專欄仍是Github Page?...

有不少技術人員在學習到必定程度后發現了寫博客的重要性,一方面幫助本身記憶,一方面也能幫助他人解決問題,因而會選擇本身開始寫博客,以后又發現平臺太多不知從何下手,在這里我根據本身寫博客的經驗比較一下各個平臺的…

計算機文化基礎重點知識歸納,計算機文化基礎_第二章重點知識總結(考試必備!!!)...

操作系統:是管理軟硬件資源、控制程序執行、改善人機界面、合理組織計算機工作流程和為用戶使用計算機提供良好運行環境的一種系統軟件。操作系統的四種特性:并發性、共享性、虛擬性、異步性。并發性:是指兩個或兩個以上的運行程序在同一時間…

計算機入門 姚班,清華“姚班”:學霸中的尖子生,大佬畢業后都去哪了?

清華大學作為國內頂尖學府,其招收的都是來自全國各地的各種各樣頂尖的學子,不過,在這所頂級學府之中,還有一個班級被認為是尖子生的“尖子班”,能夠進入這個班級學習的學生可謂是鳳毛麟角,他們往往智商過人…

c++生成光柵條紋程序_共享屋:一文讓你認識光柵尺和編碼器

堅持學習與健身,是對自己最大的投資每天進步一點點共享屋數控機床電氣調試與維修微信:799309212大家好,我是共享屋,每天通過一篇文章分享我的經驗與觀察,希望能夠給你一些啟發或者幫助。分享的主題是有關數控機床電氣調…

計算機安全事故由誰整改,信息安全檢查整改方案 整改方案 .doc

信息安全檢查整改方案 整改方案篇一:信息安全檢查整改報告XX市工商行政管理局關于2012年信息安全檢查整改報告市公安局:4月18日貴單位對我局進行信息安全等級保護工作進行監督檢查后,按照《中華人民共和國計…