展開說說:Android服務之實現AIDL跨應用通信

前面幾篇總結了Service的使用和源碼執行流程,這里再簡單分析一下如果需要Service跨進程通信該怎樣做。AIDL(Android Interface Definition Language)Android接口定義語言,用于實現?Android 兩個進程之間進行進程間通信(IPC)。

AIDL技術跨進程通信可以理解為是服務端和客戶端之間的通信(IPC),定義Service的進程稱為服務端,調用服務的進程就是客戶端。

分析一下服務端生成aidl、定義Service已經再客戶端調用服務。本文使用的兩個APP實現,服務端是app,客戶端是otherapp。

1、首先準備兩個Android工程

我這里就是建一個project然后建兩個module,您也可以建兩個project反正最后都是安裝到同一個手機的兩個APP。

2、服務端工程新建aidl文件

建議直接通過鼠標右鍵-> New -> AIDL -> AIDL File新建一個?adil 文件,build 后生成對應的 java 類。

AIDL文件,setName是我定義的方法:

// IMyAidlInterface.aidl
package com.example.testdemo;// Declare any non-default types here with import statementsinterface IMyAidlInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);/*** 自定義方法*/void setName(String name);
}

自動生成的java文件:

這里內容不少,里面有個內部類名字叫Stub

public static abstract class Stub extends android.os.Binder implements com.example.testdemo.IMyAidlInterface{

}

Stub 類可以看到我們定義的setName方法。

注意不管你aidl文件名字叫什么編譯后的java文件都是在Stub 類定義你的方法。

3、服務端定義Service并創建對應的 Stub 對象;

/*** AIDL的服務端*/
public class MyService extends Service {public static final String TAG = "MyService";private boolean setServiceRunning = true;@Overridepublic void onCreate() {super.onCreate();}@Overridepublic IBinder onBind(Intent intent) {Log.e(TAG, "onBind: " );return mStub;}IMyAidlInterface.Stub mStub = new IMyAidlInterface.Stub() {@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {}@Overridepublic void setName(String name) throws RemoteException {Log.e(TAG, "setName:  收到other說的name= "+name );}};
}

清單文件注冊:

<serviceandroid:name="com.example.testdemo.service.MyService"android:enabled="true"android:exported="true"><intent-filter><category android:name="android.intent.category.DEFAULT"></category></intent-filter>
</service>

4、客戶端要將服務端這個aidl文件拷貝過來,準備和服務端一模一樣的生活環境,?兩端的aidl 文件和所在包名必須一致

Intent intentService = new Intent();
intentService.setComponent(new ComponentName("com.example.testdemo","com.example.testdemo.service.MyService"));
boolean b = bindAidl(intentService);
private boolean bindAidl(Intent intent) {ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {Log.e(TAG, "onServiceConnected: " );IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);//連接成功,調用綁定的service中的方法try {iMyAidlInterface.setName("Hello 服務端,我是Server端");} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.e(TAG, "onServiceDisconnected: " );}@Overridepublic void onBindingDied(ComponentName name) {Log.e(TAG, "onBindingDied: " );}@Overridepublic void onNullBinding(ComponentName name) {Log.e(TAG, "onNullBinding: " );}};boolean b = bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);Log.e(TAG, "onClick: start-bind   結果="+b);return b;
}

注意:

第一:上面代碼intentService.setComponent(new ComponentName("com.example.testdemo","com.example.testdemo.service.MyService"));中創建ComponentName實例的第一個參數是應用的包名,不攜帶類的上層路徑;第二個參數是你定義的服務這個Java文件的全類名

第二:bindService方法如果返回報錯,需要在androidManifest,xml中加入
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
????tools:ignore="QueryAllPackagesPermission" />
?<queries>
?????<package android:name="com.example.testdemo"/>
?</queries>
第三:如果加了上面第二點這些導致項目編譯失敗,報錯"manifest merger failed xxxx " ,需要把根工程里的build.gradle中的classPath升級到3.5.4或以上,比如classpath "com.android.tools.build:gradle:3.5.4"

才疏學淺,如有錯誤,歡迎指正,多謝。

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

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

相關文章

Clickhouse的聯合索引

Clickhouse 有了單獨的鍵索引&#xff0c;為什么還需要有聯合索引呢&#xff1f;了解過mysql的兄弟們應該都知道這個事。 對sql比較熟悉的兄弟們估計看見這個聯合索引心里大概有點數了&#xff0c;不過clickhouse的聯合索引相比mysql的又有些不一樣了&#xff0c;mysql 很遵循最…

深入解析Spring Boot的application.yml配置文件

目錄 引言Spring Boot配置文件簡介 application.yml的優點 基本結構與語法 YAML語法基礎Spring Boot中application.yml的基本結構 常見配置項詳解 服務器配置數據源配置日志配置其他常見配置 環境配置與Profile 多環境配置激活Profile 高級配置與技巧 屬性的占位符替換自定義配…

Spring源碼二十:Bean實例化流程三

上一篇Spring源碼十九&#xff1a;Bean實例化流程二中&#xff0c;我們主要討論了單例Bean創建對象的主要方法getSingleton了解到了他的核心流程無非是&#xff1a;通過一個簡單工廠的getObject方法來實例化bean&#xff0c;當然spring在實例化前后提供了擴展如&#xff1a;bef…

第5章-組合序列類型

#全部是重點知識&#xff0c;必須會。 了解序列和索引|的相關概念 掌握序列的相關操作 掌握列表的相關操作 掌握元組的相關操作 掌握字典的相關操作 掌握集合的相關操作1&#xff0c;序列和索引 1&#xff0c;序列是一個用于存儲多個值的連續空間&#xff0c;每一個值都對應一…

升級之道:精通Conda的自我升級藝術

升級之道&#xff1a;精通Conda的自我升級藝術 引言 Conda是Python和其他科學計算語言的強大包管理器&#xff0c;它不僅管理著包的安裝和依賴&#xff0c;還負責自身的更新。隨著開源社區的不斷發展&#xff0c;Conda定期發布新版本以修復已知問題、增加新功能和提高性能。本…

[面試愛問] https 的s是什么意思,有什么作用?

HTTPS 中的 "S" 代表 "Secure"&#xff0c;即安全的意思。HTTPS&#xff08;全稱是 HyperText Transfer Protocol Secure&#xff09;是HTTP&#xff08;HyperText Transfer Protocol&#xff09;的安全版本&#xff0c;主要作用是為互聯網通信提供安全保護…

靈活多變的對象創建——工廠方法模式(Python實現)

1. 引言 大家好&#xff0c;又見面了&#xff01;在上一篇文章中&#xff0c;我們聊了聊簡單工廠模式&#xff0c;今天&#xff0c;我們要進一步探討一種更加靈活的工廠設計模式——工廠方法模式。如果說簡單工廠模式是“萬能鑰匙”&#xff0c;那工廠方法模式就是“變形金剛”…

生成式人工智能:助攻開發者還是取代開發者?

引言 近年來&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在軟件開發領域掀起了一場革命&#xff0c;為開發者帶來了全新的工具和可能性。從代碼生成、錯誤檢測到自動化測試&#xff0c;AI正在以各種方式改變著開發者的工作方式。然而&#xff0c;這也引發了人們對開…

Python采集京東標題,店鋪,銷量,價格,SKU,評論,圖片

京東的許多數據是通過 JavaScript 動態加載的&#xff0c;包括銷量、價格、評論和評論時間等信息。我們無法僅通過傳統的靜態網頁爬取方法獲取到這些數據。需要使用到如 Selenium 或 Pyppeteer 等能夠模擬瀏覽器行為的工具。 另外&#xff0c;京東的評論系統是獨立的一個系統&a…

offer題目33:判斷是否是二叉搜索樹的后序遍歷序列

題目描述&#xff1a;輸入一個整數數組&#xff0c;判斷該數組是不是某二叉搜索樹的后序遍歷結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。例如&#xff0c;輸入數組{5,7,6,9,11,10,8},則返回true,&#xff0c;因為這個整數是下圖二叉搜索樹…

c++內存管理(上)

目錄 引入 分析 說明 C語言中動態內存管理方式 C內存管理方式 new/delete操作內置類型 new和delete操作自定義類型 引入 我們先來看下面的一段代碼和相關問題 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1…

集訓day3:并查集

一、目錄 1.并查集模版 2.并查集的理解和應用 二、正文 1.并查集模版 P3367 【模板】并查集 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 2.并查集的理解與應用 (1).并查集與聯通塊數量 P1197 [JSOI2008] 星球大戰 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) P1656 炸…

數圖助推朝陽佳惠遼寧華聯開啟數字化導航、精細化管理新紀元!

近期&#xff0c;遼寧省著名零售企業朝陽佳惠與遼寧華聯&#xff0c;秉持創新精神&#xff0c;大膽嘗試&#xff0c;在品類空間管理方面推出了創新舉措。引入了先進的數圖可視化陳列管理系統&#xff0c;通過智能化、直觀化的方式優化商品布局。此舉不僅大幅提高了商品管理的效…

去除各種軟件彈窗教程

清羽彈窗 在mutil/OnlineDialog/onPostExecute前 添加return-void Arm彈窗 第一步&#xff0c;提取安裝包 第二步&#xff0c;搜索代碼Ljava/io/DataOutputStream;->flush()V 第三步&#xff0c;往上看找到 .registers 10 在下面加return-void 云注入彈窗 第一種方法:dex搜…

Sql 導入到 Excel 工具

Sql 導入到 Excel 工具 這個VBA宏的步驟如下&#xff1a; 通過文件對話框選擇SQL文件。讀取文件內容。解析文件中的每一行&#xff0c;如果包含“insert into”&#xff0c;則提取表名。檢查是否已經存在以表名命名的工作表&#xff0c;如果不存在則創建新的工作表。將數據插…

element-ui封裝分頁組件:實現首頁、上一頁、下一頁、末頁、跳轉按鈕

首頁、上一頁、下一頁、末頁、跳轉按鈕 因為el-pagination只有一個插槽&#xff0c;所以通過兩個el-pagination插槽分別加入首頁、末頁按鈕&#xff0c;再拼接這兩個el-pagination的方式來實現首頁、末頁按鈕跳轉按鈕不用加事件&#xff0c;如果el-pagination修改了前往的頁數…

【work】AI八股-神經網絡相關

Deep-Learning-Interview-Book/docs/深度學習.md at master amusi/Deep-Learning-Interview-Book GitHub 網上相關總結&#xff1a; 小菜雞寫一寫基礎深度學習的問題&#xff08;復制大佬的&#xff0c;自己復習用&#xff09; - 知乎 (zhihu.com) CV面試問題準備持續更新貼 …

VOI(Virtual Operating System Infrastructure,虛擬操作系統基礎架構)

VOI&#xff08;Virtual Operating System Infrastructure&#xff0c;虛擬操作系統基礎架構&#xff09;架構在桌面虛擬化領域具有其獨特的優勢&#xff0c;使得它在某些場景下表現尤為出色。以下是幾個具體場景&#xff1a; 1. 重載性能需求場景 表現&#xff1a; 高效利用…

聚類分析方法(二)

目錄 三、層次聚類方法&#xff08;一&#xff09;層次聚類策略&#xff08;二&#xff09;AGNES算法&#xff08;三&#xff09;DIANA算法 四、密度聚類方法&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;算法描述&#xff08;三&#xff09;計算實例&#xf…

Google賬號輸入用戶名和密碼后提醒要到手機通知點是,還要點擊數字,但是我手機收不到

有一些朋友換了一個新的電腦后手機登錄谷歌賬號時&#xff0c;用戶名和密碼都正確輸入以后&#xff0c;第三步彈出一個提示&#xff0c;要在手機上的通知欄點擊是&#xff0c;并且點擊手機上相應的數字才能繼續登錄。 但是自己的手機上下拉通知欄卻沒有來自谷歌的通知&#xf…