Kotlin--›IPC跨程序通訊之AIDL(雙向通訊)
Messenger
是系統對aidl
一個輕量封裝, 方便使用, 但是有一定侷限性.
本文介紹直接介紹aidl
的使用, 讓跨程序通訊就跟本地呼叫一樣爽.
準備
- 定義呼叫介面
- 建立相應的自定義資料Bean
用系統自帶的選單, 建立AIDL
檔案, 並寫上自己的介面定義.
你也可以直接建立File
字尾名為aidl
,沒毛病;
需要注意的點
自定義的資料型別, 需要手動import xxx.xxx
, 系統不會自動匯入.
引數型別還可以使用in
out
inout
標識.參考這裡
需要注意的點
自定義的資料類, 需要在aidl
資料夾中, 建立對應的aidl
檔案, 並且包名
和類名
需要完全一致.
服務端編寫
class RemoteService : Service() { /*用來和客戶端通訊的回撥*/ var callback: ICallback? = null private fun sendText(what: Int, text: String) { callback?.callback("服務端回撥:", MsgBean(text)) } val myAidlInterface = object : IMyAidlInterface.Stub() { override fun addCallback(callback: ICallback?) {
[email protected] = callback } override fun sendMsg(msg: MsgBean?): Int { sendText(200, msg?.message ?: "empty") return 200 } override fun getMsg(flag: Int): MsgBean { return MsgBean("getMsg 測試_flag:$flag") } } override fun onBind(p0: Intent?): IBinder { return myAidlInterface //直接返回成員物件 } }
相較於Messenger
方式, 服務端的程式碼簡潔了很多.
客戶端編寫
class MainActivity : AppCompatActivity() {
//宣告物件
var myAidlInterface: IMyAidlInterface? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val remoteServiceIntent = Intent(this, RemoteService::class.java)
val remoteCon = object : ServiceConnection {
override fun onServiceDisconnected(p0: ComponentName?) {
L.e("call: onServiceDisconnected -> $p0")
showText("onServiceDisconnected_${p0}")
myAidlInterface = null
}
override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
L.e("call: onServiceConnected -> $p0 $p1")
showText("onServiceConnected_${p0}")
//需要通過asInterface的方式,建立物件
myAidlInterface = IMyAidlInterface.Stub.asInterface(p1)
sendText(1, "客戶端連線成功...")
}
}
findViewById<View>(R.id.bind).setOnClickListener {
bindService(remoteServiceIntent, remoteCon, Service.BIND_AUTO_CREATE)
}
}
private fun sendText(what: Int, text: String) {
myAidlInterface?.let {
//直接呼叫物件的方法進行通訊,即可.
it.addCallback(object : ICallback.Stub() {
override fun callback(str: String?, msg: MsgBean?) {
showText("callback 回撥:$str $msg")
}
})
val sendMsg = it.sendMsg(MsgBean("${what}_${text}"))
L.e("call: sendText -> 返回值:$sendMsg ${it.getMsg(404)}")
}
}
}
不要忘了在AndroidManifest.xml宣告:
<service
android:name=".RemoteService"
android:process=":remote"/>
也許你還想學習更多, 來我的群吧, 我寫程式碼的能力, 遠大於寫文章的能力:
聯絡作者
請使用QQ掃碼加群, 小夥伴們都在等著你哦!
關注我的公眾號, 每天都能一起玩耍哦!
相關推薦
Kotlin--›IPC跨程序通訊之AIDL(雙向通訊)
Messenger是系統對aidl一個輕量封裝, 方便使用, 但是有一定侷限性. 本文介紹直接介紹aidl的使用, 讓跨程序通訊就跟本地呼叫一樣爽. 準備 定義呼叫介面 建立相應的自定義資料Bea
Kotlin--›IPC跨程序通訊之Messager(雙向通訊)
Android跨程序通訊有很多種方式, 具體的大家百度一下就知道了. AIDL就是其中一種; 本文介紹AIDL系統輕量封裝Messager的使用. 涉及到的類 類名 作用
跨程序通訊之AIDL-----不同應用程式之間跨程序
AIDL,通俗來說就是兩個Android應用要進行通訊,且不能通過網路雲伺服器的方式進行資料互動,只能呼叫本地函式庫的機制來實現,這時Android系統提供AIDL的機制來實現Android的跨程序通訊(使用者程序之間是相對封閉的,無法直接訪問資料)。 我們先不
Android程序通訊之AIDL Demo
###AIDL檔案 package com.test.aidltestservice;//包名,注意ADIL檔案在工程中的存放位置要與包名一致 // Declare any non-default types here with import statements interface
Android 進階9:程序通訊之 AIDL 解析
讀完本文你將瞭解: 在 Android 進階7:程序通訊之 AIDL 的使用 中我們使用 AIDL 實現了跨程序的通訊,但是不清楚 AIDL 幫我們做了什麼。 AIDL 的本質是簡化我們 IPC 開發,它使用的是 Binder 機制,於是在上篇文章
Android 進階7:程序通訊之 AIDL 的使用
讀完本文你將瞭解: 記得 2015 年實習面試,筆試題裡就有這道題:請介紹下 AIDL。 當時的我是懵逼的,只好老老實實空著。沒想到後來面試時面試官大哥嘿嘿一笑說他也沒用過這玩意,真是夠實誠的。 筆試完查了這個知識點,似懂非懂也沒深究。去年看《安卓開
跨程序訪問(AIDL服務)
我們都知道Service的主要的作用是後臺執行和跨程序訪問。 關於Service後臺執行請檢視鄙人的另外一篇文章Service基礎 本篇博文主要探討的是跨程序訪問~ 什麼是AIDL Android系統中的程序之間是不能共享記憶體,因此,需要提供一些機
QAxWidget 呼叫ocx控制元件之 js雙向通訊
1 示例: QAxWidget 載入 IE外掛 第一步 載入ie控制元件void CActivexWidget::InitActiveX() //其中 CActivexWidget 派生自QAxWidget{setControl("Shell.Explorer");//HK
使用 Messenger實現與獨立程序的Service的雙向通訊
1、先對比一下,咱們要知道什麼時候使用Messenger更合適,下面是官網給出的解釋。 Messenger 與 AIDL 比較 當您需要執行 IPC 時,為您的介面使用 要比使用 AIDL 實現它更加簡單,因為 會將所有服務呼叫排入佇列,而純粹的 AIDL 介面會同
PLC通訊之藍芽通訊
目錄 四、測試 一、實驗架構 如圖所示,其中 水迴圈水箱:上下兩個水箱,其中安裝多個感測器。 水迴圈系統:採集水迴圈水箱資料,顯示並通過藍芽傳給智慧感知系統。(PLC採用WAGO 750-881) 智慧感知系統:接收水迴圈系統中藍芽
Android 網路通訊之HTTP請求通訊
Android網路通訊平臺支援還是比較豐富的,除了相容J2ME中的java.netapi外還提供了一下Android平臺獨有的類android.net這個Package。一種是GET方式,一種是POST方式。然後HttpClient的Get/Post方式。似乎更強大的是org.apache.http類,這個
【朝花夕拾】效能優化篇之(八)AIDL與Android跨程序通訊
一、Linux程序間通訊 1、程序隔離 在作業系統中,程序與程序間的記憶體和資料都是不共享的。兩個程序就好像大海中相互獨立的兩個島嶼,各自生活在互相平行的兩個世界中,互不干擾,各
Android 跨程序雙向通訊(Messenger與AIDL)詳解
今天這篇文章主要講一下Messenger與AIDL的區別、優缺點以及各自的使用方法。 Messenger與AIDL的異同 一、Messenger與AIDL相同點 1.都與IPC的呼叫有關; 2.Messenger 是一種輕量級的
Android使用AIDL實現跨程序通訊(IPC)
前言:在還沒有做任何一件事情之前,千萬不要覺得這件事情很難,因為還沒有開始做內心就已經對這件事情產生了恐懼,這將會阻止你的進步,也許當你動手開始做了這件事後發現其實並不是很難。 一、 AIDL概述 含義:AIDL(Android Interface Defi
Android開發之AIDL實現遠端服務程序通訊(IPC)
首先什麼是AIDL呢,它是Android系統中的一種介面定義語言,用於約束兩個程序間的通訊規則,供編譯器生成程式碼。 實現Android裝置上的兩個程序間通訊(IPC),程序之間的通訊資訊首先會被轉換成AIDL協議資訊,然後傳送給對方;對方接收到AIDL協議資
Android進階——Android跨程序通訊機制之Binder、IBinder、Parcel、AIDL
前言 Binder機制是Android系統提供的跨程序通訊機制,這篇文章開始會從Linux相關的基礎概念知識開始介紹,從基礎概念知識中引出Binder機制,歸納Binder機制與Linux系統的跨程序機制的優缺點,接著分析Binder的通訊模型和原理,而Bin
一個小Demo來理解關於IPC(程序間通訊)中的aidl
專案地址: Server端程式碼:Server端程式碼連結 Client端程式碼:Client端程式碼連結 1、IPC的基本要求 IPC(Inter-Process Communication)程序間通訊是要在兩個相互獨立的程序之間進行資訊的傳遞,在Android中每個程序都會被分配
Android每天一個知識點+Demo—跨程序通訊機制AIDL入門
一 Why-為什麼要用AIDL 沙箱理念:在Android中,每個應用(Application)程式都執行在獨立的程序中,無法直接呼叫到其他應用的資源。當一個應用被執行時,一些操作是被限制的,比如訪問記憶體,訪問感測器等等。 好處:這也保證了當其中一個程式出現異常而不會影
android中的跨程序通訊的實現(一)——遠端呼叫過程和aidl
android在設計理念上強調元件化,元件之間的依賴性很小。我們往往發一個intent請求就可以啟動另一個應用的activity,或者一個你不知道在哪個程序的service,或者可以註冊一個廣播,只要有這個事件發生你都可以收到,又或者你可以查詢一個contentProvider獲得你想要的資料,這其
Python學習【第20篇】:互斥鎖以及程序之間的三種通訊方式(IPC)以及生產者個消費者模型 python併發程式設計之多程序1-----------互斥鎖與程序間的通訊
python併發程式設計之多程序1-----------互斥鎖與程序間的通訊 一、互斥鎖 程序之間資料隔離,但是共享一套檔案系統,因而可以通過檔案來實現程序直接的通訊,