android aidl的使用及demo
demo下載地址
----------
概述:AIDL即跨程序通訊
1.在main下面新建aidl檔案
// IMyAidlInterface.aidl
package com.android.aidl;
// Declare any non-default types here with import statements
import com.android.aidl.bean.Person;
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void addPerson(in Person person);
}
注意:如果addPerson(in Person person)不需要傳Parcelable型別的Person物件,則不需要相應的Person.aidl檔案及導包操作
“AIDL服務只支援有限的資料型別,因此,如果用AIDL服務傳遞一些複雜的資料就需要做更一步處理。AIDL服務支援的資料型別如下:
Java的簡單型別(int、char、boolean等)。不需要匯入(import)。
String和CharSequence。不需要匯入(import)。
List和Map。但要注意,List和Map物件的元素型別必須是AIDL服務支援的資料型別。不需要匯入(import)。
AIDL自動生成的介面。需要匯入(import)。
實現android.os.Parcelable介面的類。需要匯入(import)。
其中後兩種資料型別需要使用import進行匯入,將在本章的後面詳細介紹。
傳遞不需要import的資料型別的值的方式相同。傳遞一個需要import的資料型別的值(例如,實現android.os.Parcelable介面的類)的步驟略顯複雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl檔案,並使用parcelable關鍵字進行定義。”
2.如果是帶實體且型別為Person implements Parcelable型別的則注意需要相應aidl新建實體的aidl檔案,且注意導包
---------------
// Person.aidl
package com.android.aidl.bean;
//還要和宣告的實體類在一個包裡
parcelable Person;
-----------
package com.android.aidl.bean;
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
private String mName;
public Person(String name) {
mName = name;
}
protected Person(Parcel in) {
mName = in.readString();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mName);
}
@Override
public String toString() {
return "Person{" +
"mName='" + mName + '\'' +
'}';
}
}
------------------
結構如下圖所示
3.之後make project則會生成app\build\generated\source\aidl\debug\com\android\yxz\aidltest03\IMyAidlInterface.java檔案,如果沒有生成則會編譯報錯,根據相應的錯誤提示修改即可
4.之後將main下面的aidl檔案拷貝到另一個工程下面,確保包名類名一致,然後同樣make project生成相應的java檔案
5.之後再工程A中啟動工程B的bindservice,在工程A的ServiceConnection mConnection = new ServiceConnection()回撥中可以得到binder,通過binder呼叫彼此aidl公共定義的方法就能呼叫到對方的方法了,當程序被殺死的時候會走onServiceDisconnected
---------
工程A
public class MainActivity extends AppCompatActivity {
public static final String TAG = "xiaozheng";
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
Log.d(TAG, "click");
mAidl.addPerson(new Person("yxz"));
}catch (Exception e){
e.printStackTrace();
Log.d(TAG, "e="+e);
}
}
});
bindService();
}
private void bindService() {
Intent serverIntent = new Intent();
serverIntent.setClassName("com.android.yxz.aidltestb", "com.android.yxz.aidltestb.MyAidlService");
bindService(serverIntent, mConnection, Context.BIND_AUTO_CREATE);
}
private IMyAidlInterface mAidl;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//連線後拿到 Binder,轉換成 AIDL,在不同程序會返回個代理
Log.d(TAG, "onServiceConnected name="+name);
mAidl = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected name="+name);
mAidl = null;
}
};
}
---------
工程B的service
public class MyAidlService extends Service {
public static final String TAG = "xiaozheng";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "MyAidlService onCreate");
}
private IBinder mIBinder =new IMyAidlInterface.Stub(){
@Override
public void addPerson(Person person) throws RemoteException {
Log.d(TAG, "AidlTestB addPerson person="+person);
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mIBinder;
}
}
6.service記得在清單裡面註冊,且屬性裡面加以下屬性,否則會報錯Not allowed to bind to service Intent
<service android:name=".MyAidlService"
android:exported="true"/>
7.點選button即工程A呼叫到了工程B的方法,即實現了跨程序通訊的目的
相關推薦
android aidl的使用及demo
demo下載地址 ---------- 概述:AIDL即跨程序通訊 1.在main下面新建aidl檔案 // IMyAidlInterface.aidl package com.android.aidl; // Declare any non-default t
Android widget簡介及demo
文章目錄 1、簡介 2、檔案結構 3、res->xml->appwidget_info.xml 4、main_activity.xml 5、AndroidManifest.x
Android 三種常用實現自定義圓形進度條 ProgressBar 及demo
Android 自定義 進度條,一般有三種方式,最早一般使用UI給的圖片使用幀動畫,完成,後面兩種,一種是使用自定義顏色,另外一種是使用帶相近色的圖片加動畫完成。 下面具體 說一下三種方式,推薦使用第二種方式,如果這種達不到效果,或者比較高也可使用第一
Android AIDL -通過一個比較完整的Demo快速運用
前端時間專案運用到AIDL,關於AIDL客戶端以及AIDL服務端網路上沒有一個比較完備的Demo. 而參考Demo無疑是一個比較快速的學習方法.因此,我寫了一個Demo. 供大家參考,也非常歡迎大家對其中寫的不好的地方進行指正. 好了,首先簡述下基本功能: 在AIDL 客
Android的AIDL 解釋Demo
前言 Android的AIDL不僅可以在繫結服務中傳遞一些Android規定的資料型別的資料,還可以傳遞一些複雜型別的資料。但是與傳遞系統允許的資料型別相比,複雜型別資料的傳遞要做更多的工作,本篇部落格就講解一下如何使用AIDL介面通過繫結服務在程序間傳遞資料。關於
Android執行緒池的使用及demo
一、為什麼要使用執行緒池: 1、減少了建立執行緒的數量,提高了APP的效能 2、節省開銷,防止併發執行緒過多,便於執行緒的管理 二、執行緒池的分類(四類) newCachedThreadPool 快取型執行緒池: 如果池中沒有執行緒可用,它將建
Android——AIDL基礎實現demo以及原理探究
最近有一段時間沒寫部落格了,打算最近趁著有時間補補,本文是總結的AIDL的基本使用和原理。 分為兩個部分:一是簡單的上手demo,二是對程式碼邏輯進行分析。 一:簡單的AIDL小Demo: 服務端: 1.新建服務端工程AIDLserver,新建AIDL檔案: 2.開啟該
android 後臺監聽按鍵事件方法及demo
demo下載地址 =============== 1.概述:最方便的方式還是修改系統原始碼按鍵事件,將鍵值發廣播出來給應用監聽,其次是用設定裡面的輔助功能的AccessibilityService也可監聽按鍵事件,但是前提是需要在設定中開啟此輔助功能的開關才行,前面的
Android 驅動程式Demo及流程
很久前就想了解驅動程式的想法,這裡現做一個簡單的開始,從demo做起,看到Android驅動程式的基本執行流程,這對漏洞分析、檢測和挖掘都是必要的。同樣,本篇基本也是自己學習過程的記錄,無干貨。本篇大多數內容來自Linux裝置驅動之Ioctl控制。 一、使用者
android AIDL 實踐之傳遞簡單字串
trace his int ati activity 表示 asi client text *本demo的server和client寫反了 新建工程client,server 在server端新建aidl文件,內容: // IMyAidlInterface.aidl pac
Android AIDL Service 跨進程傳遞復雜數據
構造函數 lar 建立 comm rtt enc mar 它的 created 黑夜 黑夜給了我黑色的眼睛,我卻用它尋找光明~ 傳值方式 AIDL是同意跨進程傳遞值的,一般來說有三種方式: - 廣播;這樣的算是比較常見的一種方式了,傳遞小數據
aNDROID瀏覽器及WEBWIDGET
hao123 瀏覽器 aid baidu wid get and andro android aNDROID%E7%80%91%E5%B8%83%E6%B5%81%E7%85%A7%E7%89%87%E5%A2%99%E5%AE%9E%E7%8E%B0 http://mu
IDA 調試 Android 方法及簡單的脫殼實現
all fun cati chm std function sso .apk 代碼位置 IDA 調試 Android 方法及簡單的脫殼實現 標簽: android原創逆向調試dalvik 2016-05-24 14:24 9286人閱讀 評論(3) 收藏
Android 背景及狀態欄設置集合
ans bubuko nbsp info his com div man pre 狀態欄透明(狀態欄背景為應用背景)只支持4.4以上 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STAT
vuex 學習總結及demo
spa inf bubuko jpg 分享 理解 規則 連接 family vuex是vue.js應用程序開發的狀態管理模式 它采用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 官方文檔:https://vuex.vuejs.org
小編帶您進入SpringBoot (1) idea下的環境搭建及demo
Delve 繼續 tap initial ret epo public 三方庫 maven 1.Spring Boot簡介wiki上的介紹: Spring Boot是Spring的常規配置解決方案,用於創建可以“運行”的獨立的,生產級的基於Spring的應用程序。[22]它
分享一下身邊朋友自學android開發及找工作的那些事!【不足勿噴】
自己的 tis 快速 就是 和我 and 好處 adapt 分享 寫在前面 前不久身邊一個朋友突然告訴我他把原來的工作辭掉了,我問他最近在幹嘛,他說他最近兩個月學了java及android然後花了1周時間找工作,我問他現在怎麽樣了。他說比不上我們身邊這些10K-20K的現在
android入門小Demo
分享一個android端的小例子,程式碼雖少,五臟俱全。 得到的效果是 廢話不多說,直接上程式碼。 我們先看專案的結構。 我們的主活動頁面是activity_main.xml 程式碼如下 <?xml version="1.0" encoding
Android 配置及模擬器建立
Android 配置及模擬器建立 1、所用壓縮包版本為:adt-bundle-windows-x86_64-20140321 2、將壓縮包adt-bundle-windows-x86_64-20140321.zip移動到D:\Android,然後解壓到此目錄下 3、解壓縮後進入
TensorFlow Lite for Android 初探(附demo)
一. TensorFlow Lite TensorFlow Lite 是用於移動裝置和嵌入式裝置的輕量級解決方案。TensorFlow Lite 支援 Android、iOS 甚至樹莓派等多種平臺。 我們知道大多數的 AI 是在雲端運算的,但