最新版本1.0.1
為了讓用戶能更靈活到進(jìn)行進(jìn)程間的通信,不在局限于Activity使用場景,1.0.0版本做了全面的改進(jìn),可方便用戶在進(jìn)程中任何地方和另一個(gè)進(jìn)程進(jìn)行通信,同時(shí)也不在支持0.0.1的用法,給用戶帶來的不便盡請諒解。老版本用戶可根據(jù)新版本的用法做簡單的改動(dòng)就可以升級上來。
Android 進(jìn)程間通信最牛方案,為簡單而生
Github 源碼: ABridge
一、介紹
做Android開發(fā)的小伙伴們是不是經(jīng)常有遇到同一個(gè)公司有多個(gè)App,而這些App之間需要進(jìn)行通信業(yè)務(wù)。于是需要解決這種IPC問題,而ABridge可輕松解決進(jìn)程間通信問題。
二、Android IPC方式
跨進(jìn)程常見的幾種通信方式:Bundle通過Intent傳遞數(shù)據(jù),文件共享,ContentProvider,基于Binder的AIDL和Messenger以及Socket。
三、IPC是what?
也許有些小伙伴還不是很清楚IPC概念,這里我簡單的概述一下。
IPC是 Inter-Process Communication的縮寫,意為進(jìn)程間通信或跨進(jìn)程通信,是指兩個(gè)進(jìn)程之間進(jìn)行數(shù)據(jù)交換的過程。
線程是CPU調(diào)度的最小單元,同時(shí)線程是一種有限的系統(tǒng)資源。進(jìn)程一般指一個(gè)執(zhí)行單元,在PC和移動(dòng)設(shè)備上指一個(gè)程序或者一個(gè)應(yīng)用。一個(gè)進(jìn)程可以包含多個(gè)線程,因此進(jìn)程和線程是包含與被包含的關(guān)系。最簡單的情況下,一個(gè)進(jìn)程中只可以有一個(gè)線程,即主線程,在Android中也叫UI線程。
IPC不是Android中所獨(dú)有的,任何一個(gè)操作系統(tǒng)都需要相應(yīng)的IPC機(jī)制,比如Windows上可以通過剪貼板等來進(jìn)行進(jìn)程間通信。Android是一種基于Linux內(nèi)核的移動(dòng)操作系統(tǒng),它的進(jìn)程間通信方式并不能完全繼承自Linux,它有自己的進(jìn)程間通信方式。
四、Why ABridge
在使用ABridge之前,我們可以通過上面的方式來實(shí)現(xiàn)IPC,但這些方式實(shí)現(xiàn)過程繁瑣,學(xué)習(xí)成本較高。為此,ABridge誕生了——一款可以幾行代碼輕松實(shí)現(xiàn)跨進(jìn)程通信框架。
ABridge提供了兩種方案進(jìn)行跨進(jìn)程來滿足不同場景的業(yè)務(wù)需求:一種是基于Messenger,另一種是基于AIDL。當(dāng)然Messenger本質(zhì)也是AIDL,只是進(jìn)行了封裝,開發(fā)的時(shí)候不用再寫.aidl文件。
五、新版本基本用法
step1 添加依賴
api "com.sjtu.yifei:abridge:_latestVersion"
step2 初始化
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//注意這里的packagename,需要通信的多個(gè)app只能使用一個(gè)packagename
//ABridge初始化有兩種方式
//方式一:基于Messenger
IBridge.init(this, "com.sjtu.yifei.aidlserver", IBridge.AbridgeType.MESSENGER);
//方式二:基于自定義的AIDL
IBridge.init(this, "com.sjtu.yifei.aidlserver", IBridge.AbridgeType.AIDL);
}
@Override
public void onTerminate() {
//注意釋放
IBridge.recycle();
super.onTerminate();
}
}
step3 通信使用
3.1 基于Messenger IPC
// 1 注冊回調(diào)
IBridge.registerMessengerCallBack(callBack = new AbridgeMessengerCallBack() {
@Override
public void receiveMessage(Message message) {
if (message.arg1 == ACTIVITYID) {
//todo客戶端接受服務(wù)端傳來的消息
}
}
});
// 2 反注冊回調(diào),避免內(nèi)存泄漏
IBridge.uRegisterMessengerCallBack(callBack);
// 3 發(fā)送消息
Message message = Message.obtain();
message.arg1 = ACTIVITYID;
//注意這里,把`Activity`的`Messenger`賦值給了`message`中,當(dāng)然可能你已經(jīng)發(fā)現(xiàn)這個(gè)就是`Service`中我們調(diào)用的`msg.replyTo`了。
Bundle bundle = new Bundle();
bundle.putString("content", messageStr);
message.setData(bundle);
IBridge.sendMessengerMessage(message);
3.2 基于AIDL IPC
// 1 注冊回調(diào)
IBridge.registerAIDLCallBack(callBack = new AbridgeCallBack() {
@Override
public void receiveMessage(String message) {
//todo客戶端接受服務(wù)端傳來的消息
}
});
// 2 反注冊回調(diào),避免內(nèi)存泄漏
IBridge.uRegisterAIDLCallBack(callBack);
// 3 發(fā)送消息
String message = "待發(fā)送消息";
IBridge.sendAIDLMessage(message);
注、版本更新到1.0.0以后將棄用0.0.1版本基本用法以下是老版本用法
- 方案一:基于Messenger
step1 添加依賴
api "com.sjtu.yifei:abridge:xxx.xxx.xxx"
step2 初始化
public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); //注意這里的packagename,需要通信的多個(gè)app只能使用一個(gè)packagename //即使用一個(gè)app作為server啟動(dòng)這個(gè)共享服務(wù)來進(jìn)行通信 IBridge.init(this, "packagename"); } }
step3 需要通信的activity實(shí)現(xiàn)接口 MessengerReceiver
public class TestMessengerActivity extends AppCompatActivity implements MessengerReceiver { //跨進(jìn)程通信的 發(fā)送器 private MessengerSender sender; //MessengerReceiver 接口方法 設(shè)置發(fā)送器 @Override public void setSender(MessengerSender sender) { this.sender = sender; } //MessengerReceiver 接口方法 接受跨進(jìn)程發(fā)送過來的message @Override public void receiveMessage(Message message) { if (message.arg1 == ACTIVITYID) { //客戶端接受服務(wù)端傳來的消息 String str = (String) message.getData().get("content"); tv_show_in_message.setText(str); } } }
step4 跨進(jìn)程發(fā)送信息
//接上文 public void sendMessage(String messageStr) Message message = Message.obtain(); message.arg1 = ACTIVITYID; Bundle bundle = new Bundle(); bundle.putString("content", messageStr); message.setData(bundle); sender.sendMessage(message); }
- 方案二:基于AIDL
step1 添加依賴
api "com.sjtu.yifei:abridge:xxx.xxx.xxx"
step2 初始化
public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); //注意這里的packagename,需要通信的多個(gè)app只能使用一個(gè)packagename //即使用一個(gè)app作為server啟動(dòng)這個(gè)共享服務(wù)來進(jìn)行通信 IBridge.init(this, "packagename"); } }
step3 需要通信的activity實(shí)現(xiàn)接口 MessengerReceiver
public class TestAIDLActivity extends AppCompatActivity implements IReceiver { //跨進(jìn)程通信的 發(fā)送器 private ISender sender; //IReceiver 接口方法 設(shè)置發(fā)送器 @Override public void setSender(ISender sender) { this.send = sender; } //IReceiver 接口方法 接受跨進(jìn)程發(fā)送過來的message @Override public void receiveMessage(String message) { tv_user.setText(message); } }
step4 跨進(jìn)程發(fā)送信息
//接上文 public void sendMessage(String messageStr) send.sendMessage(messageStr); }