1. 程式人生 > >android aidl的使用及demo

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 客

AndroidAIDL 解釋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 是在雲端運算的,但