1. 程式人生 > >Kotlin--›IPC跨程序通訊之AIDL(雙向通訊)

Kotlin--›IPC跨程序通訊之AIDL(雙向通訊)

Messenger是系統對aidl一個輕量封裝, 方便使用, 但是有一定侷限性.

本文介紹直接介紹aidl的使用, 讓跨程序通訊就跟本地呼叫一樣爽.

準備

  1. 定義呼叫介面
  2. 建立相應的自定義資料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-----------互斥鎖與程序間的通訊 一、互斥鎖 程序之間資料隔離,但是共享一套檔案系統,因而可以通過檔案來實現程序直接的通訊,