一行程式碼實現Android的跨程式呼叫與通訊
後第一發,帶來一款更簡潔方便的Android程式通訊方案。看了網上太多的Binder以及跨程式講解,最後回到我們自己來進行跨程式通訊時發現還是相當繁瑣,定義aidl、定義Service、bindService
等一系列操作搞得頭都大了。 可簡單輕鬆解決程式間通訊問題,幾行程式碼搞定,任意程式隨時註冊服務,隨時同步獲取服務以及支援跨程式的事件匯流排。
介紹
更方便更簡潔的Android程式通訊方案,無需進行bindService()操作,不用定義Service,也不需要定義aidl。 支援IPC級的Callback,並且支援跨程式的事件匯流排。可同步獲取服務。採用面向介面方式進行服務註冊與呼叫,服務呼叫方和使用者完全解耦。
接入
1. 在全域性build裡新增倉庫
allprojects { repositories { ...... maven { url '' } } }
2. 在app的build裡新增依賴
dependencies { implementation 'com.github.zhangke3016:CmProcess:1.0.3' }
使用
1. 在Application的attachBaseContext方法中初始化
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); VCore.init(base); }
2. 定義對外提供服務功能的介面和實現
如果註冊本地服務,引數以及回撥介面沒有限制;
如果註冊遠端服務,引數型別必須為基本資料型別或者可序列化型別(serializable/parcelable),並且非同步回撥介面需要使用提供的'IPCCallback`。
public interface IPayManager { String pay(int count); //遠端服務呼叫,非同步回撥介面需要使用提供的'IPCCallback`。 String pay(int count, IPCCallback callBack); }
3. 註冊或者反註冊服務,可在任意程式呼叫;註冊的程式本地服務需要在本程式取消註冊
//註冊本地 + 遠端服務 VCore.getCore().registerService(IPayManager.class, this); //取消註冊本地 + 遠端服務 VCore.getCore().unregisterService(IPayManager.class); //註冊本地服務 VCore.getCore().registerLocalService(IPayManager.class, this); //取消註冊本地服務 VCore.getCore().unregisterLocalService(IPayManager.class);
4. 可在任意程式透過介面型別獲取服務呼叫
IPayManager service = VCore.getCore().getService(IPayManager.class); //獲取本地服務 //IPayManager service = VCore.getCore().getLocalService(IPayManager.class); //注意:如果服務未註冊時,service為null if(service != null){ //同步呼叫. String message = service.pay(5000); //非同步回撥. 推薦使用提供的 BaseCallback 已將回撥結果切換至主執行緒 service.pay(5000, new BaseCallback() { @Override public void onSucceed(Bundle result) { //Main thread 回撥結果在主執行緒 } @Override public void onFailed(String reason) { //Main thread } }); //或者 service.pay(5000, new IPCCallback.Stub() { @Override public void onSuccess(Bundle bundle) throws RemoteException { // binder thread } @Override public void onFail(String s) throws RemoteException { } }) }
5. 事件的釋出與訂閱
//訂閱事件 可在任意程式的多個位置訂閱 VCore.getCore().subscribe("key", new EventCallback() { @Override public void onEventCallBack(Bundle event) { //main thread String name = event.getString("name"); Log.e("TAG", "onEventCallBack: " + name + " " + (Looper.myLooper() == Looper.getMainLooper())); } }); //釋出事件 釋出事件後 多個程式註冊的EventCallback會同時回撥: Bundle bundle = new Bundle(); bundle.putString("name", "DoDo"); VCore.getCore().post("key",bundle); //取消訂閱 VCore.getCore().unsubscribe("key");
作者:zhangke3016
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2822126/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android跨程式通訊Android
- 詳解 CmProcess 跨程式通訊的實現
- 20 行 Python 程式碼實現加密通訊Python加密
- Android 多程式通訊Android
- 一行 Python 程式碼實現並行Python並行
- 一行程式碼實現微前端行程前端
- Java實現TCP通訊程式JavaTCP
- golang實現子程式通訊Golang
- 實現不同程式之間的通訊
- 一行程式碼實現ViewPager卡片效果行程Viewpager
- Android 程式之間通訊Android
- [Android]程式通訊Andromeda框架Android框架
- 教你C語言實現通訊錄的詳細程式碼C語言
- 通過 App Groups 實現程式間通訊APP
- Android技術分享 | 一行程式碼實現螢幕、聲音採集Android行程
- CSS 小技巧 | 一行程式碼實現頭像與國旗的融合CSS行程
- 一行程式碼實現 UIView 鏤空效果行程UIView
- Android程式間通訊詳解Android
- 4-AIII–Service跨程式通訊:aidlAI
- Android技術分享| 安卓3行程式碼,實現整套音視訊通話功能Android安卓行程
- 通過正則高效實現千位符(一行程式碼你敢信?)行程
- App 黑白化實現探索,有一行程式碼實現的方案嗎?APP行程
- 在 OpenResty 裡實現程式間通訊REST
- 自己實現一個Electron跨程式訊息元件元件
- 幻術,一行程式碼實現鏤空效果行程
- 怎樣用一行 Python 程式碼實現並行Python並行
- [Android]你不知道的Android程式化(6)--程式通訊Andromeda框架Android框架
- [Android]你不知道的Android程式化(5)--程式通訊Messenger框架AndroidMessenger框架
- [Android]你不知道的Android程式化(4)--程式通訊AIDL框架AndroidAI框架
- vysor原理與程式碼實現
- Android程式間通訊,AIDL工作原理AndroidAI
- 使用emscripten實現js直接呼叫C程式碼(emscripten的初探)JSC程式
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- 阿里Android開發規範:程式、執行緒與訊息通訊阿里Android執行緒
- FFmpeg程式碼實現視訊剪下
- EventBus,輕鬆實現跨元件跨執行緒通訊元件執行緒
- 一行程式碼實現滑鼠橫向滾動💪行程
- 一行Python程式碼能實現什麼喪心病狂的功能?Python