欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android中AIDL的使用

 更新時間:2021年07月06日 18:23:01   作者:流星雨^-^  
AIDL是Android Interface definition language的縮寫,對于小白來說,AIDL的作用是讓你可以在自己的APP里綁定一個其他APP的service,這樣你的APP可以和其他APP交互,接下來通過本文給大家分享Android AIDL使用,需要的朋友參考下吧

AIDL,即Android Interface Definition Language,Android接口定義語言。這門語言是為了實(shí)現(xiàn)進(jìn)程間通信。每一個進(jìn)程都有自己的一塊獨(dú)立的內(nèi)存,都在自己的內(nèi)存上存儲自己的數(shù)據(jù),執(zhí)行自己的操作,每個進(jìn)程之間你不知我,我不知你,而AIDL,就是兩個進(jìn)程之間溝通的橋梁。

AIDL用來做什么

AIDL是Android中IPC(Inter-Process Communication)方式中的一種,AIDL是Android Interface definition language的縮寫,對于小白來說,AIDL的作用是讓你可以在自己的APP里綁定一個其他APP的service,這樣你的APP可以和其他APP交互。

aidl文件支持的數(shù)據(jù)類型包括:

  • 八種基本數(shù)據(jù)類型:byte、char、short、int、long、float、double、boolean
  • String、CharSequence
  • 實(shí)現(xiàn)了Parcelable接口的數(shù)據(jù)類型
  • List類型。List承載的數(shù)據(jù)必須是AIDL支持的類型,或者是其他聲明的AIDL對象
  • Map類型。Map承載的數(shù)據(jù)必須是AIDL支持的類型,或者是其他聲明的AIDL對象

在使用其他聲明的AIDL對象的時候必須要導(dǎo)包,即使要使用的AIDL對象文件和當(dāng)前正在編輯的aidl文件在同一個文件夾下。

aidl文件可以分為兩類,一類用來聲明實(shí)現(xiàn)了Parcelable接口的數(shù)據(jù)類型,以供其他AIDL文件使用那些非默認(rèn)支持的數(shù)據(jù)類型。還有一類是用來定義接口方法,聲明要暴露哪些接口給客戶端調(diào)用。

AIDL的具體使用步驟是:

一、創(chuàng)建一個服務(wù)端工程

1、如果aidl文件中涉及到實(shí)現(xiàn)了Parcelable接口的數(shù)據(jù)類型,則先將該aidl文件定義出來。在src文件夾下右鍵,選擇新建aidl文件,這里新建了一個Book.aidl文件。

新建完以后,會在main文件下生成一個aidl的文件夾,aidl文件夾下的目錄結(jié)構(gòu)和java文件夾下的目錄結(jié)構(gòu)一樣。

Book.aidl文件中會有一個默認(rèn)方法。

我們刪除掉這個默認(rèn)方法,只聲明一個parcelable數(shù)據(jù)類型,這個文件就成為聲明Parcelable數(shù)據(jù)類型的AIDL文件。注意這里的parcelable中的p是小寫的。

2、這個時候我們來定義Book類并實(shí)現(xiàn)Parcelable接口,注意Book類在java文件夾下的目錄與Book.aidl文件在aidl文件夾下的目錄保持一致。

public class Book implements Parcelable {
 
    private String name;
 
    public Book(String name) {
        this.name=name;
    }
 
    protected Book(Parcel in) {
        this.name = in.readString();
    }
 
    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }
 
        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
    }
 
    /**
     * 這個方法是自己寫上去的,并不是根據(jù)錯誤提示自動生成的代碼
     * 默認(rèn)生成的模板類的對象只支持為in的定向tag。因為默認(rèn)生成的類里面只有 writeToParcel() 方法。
     * 而如果要支持為out或者inout的定向tag的話,還需要實(shí)現(xiàn)readFromParcel()方法。
     * 而這個方法其實(shí)并沒有在 Parcelable 接口里面,所以需要我們從頭寫。
     */
    public void readFromParcel(Parcel dest){
        name=dest.readString();
    }
}

這里需要注意的一點(diǎn)是如果要支持為out或inout的定向tag的話,需要我們手寫readFromParcel()方法。

3、然后我們開始寫B(tài)ookController.aidl文件來定義能被客戶端調(diào)用的接口。

package com.example.service;
 
import com.example.service.Book;
 
// Declare any non-default types here with import statements
 
interface BookController {
 
    int getInt();//int類型
    String getString();//String類型
    List<Book> getBookList();//aidl對象
    void addBook(inout Book book);//aidl對象
 
}

這里需要注意的是,雖然Book.aidl文件和BookController.aidl文件在同一個包下,還是需要手動導(dǎo)入一下。

4、至此,我們的aidl文件寫完了,然后我們Rebuild project,系統(tǒng)會幫我們生成一個與AIDL文件同名的java文件,這個java文件才是與我們跨進(jìn)程通信密切相關(guān)的東西。

5、定義一個Service,通過這個Service將接口暴露給外部。

public class AIDLService extends Service {
 
    private List<Book> bookList;
 
    public AIDLService() {
 
    }
 
    @Override
    public void onCreate() {
        super.onCreate();
        bookList = new ArrayList<>();
        initData();
    }
 
    private void initData() {
        Book book1 = new Book("花千骨");
        Book book2 = new Book("公主小妹");
        Book book3 = new Book("仙劍奇?zhèn)b傳");
        Book book4 = new Book("飄");
        Book book5 = new Book("茶花女");
        Book book6 = new Book("解憂雜貨鋪");
        Book book7 = new Book("活著");
        Book book8 = new Book("三生三世十里桃花");
        bookList.add(book1);
        bookList.add(book2);
        bookList.add(book3);
        bookList.add(book4);
        bookList.add(book5);
        bookList.add(book6);
        bookList.add(book7);
        bookList.add(book8);
    }
 
    private final BookController.Stub stub = new BookController.Stub() {
        @Override
        public int getInt() throws RemoteException {
            return bookList == null ? 0 : bookList.size();
        }
 
        @Override
        public String getString() throws RemoteException {
            return bookList == null ? "" : bookList.get(0).getName();
        }
 
        @Override
        public List<Book> getBookList() throws RemoteException {
            return bookList;
        }
 
        @Override
        public void addBook(Book book) throws RemoteException {
            if (book != null) {
                bookList.add(book);
            } else {
                Log.i("ruxing", "接收到了一個空對象 Inout");
            }
        }
    };
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
}

6、在清單文件中注冊服務(wù)。

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

至此,服務(wù)端開發(fā)完成了。

二、創(chuàng)建一個custom工程

1、新建一個custom工程,把服務(wù)端的aidl文件夾下的內(nèi)容全部拷貝到新項目中,如果aidl中有用到bean實(shí)體類,把實(shí)體類也拷貝過來,然后Rebuild Project。

2、在客戶端的activity中連接遠(yuǎn)程服務(wù),實(shí)現(xiàn)aidl通信。

public class MainActivity extends AppCompatActivity {
 
    private BookController bookController;
    private boolean connected;
    private List<Book> bookList;
 
    private Button mBtnGetBookList;
    private Button mBtnAddBook;
    private Button mBtnGetBookSize;
    private Button mBtnGetFirstBookName;
 
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            bookController = BookController.Stub.asInterface(service);
            connected = true;
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            bookController = null;
            connected = false;
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mBtnGetBookList = findViewById(R.id.btn_get_book_list);
        mBtnAddBook = findViewById(R.id.btn_add);
        mBtnGetBookSize = findViewById(R.id.btn_get_book_size);
        mBtnGetFirstBookName = findViewById(R.id.btn_first_book_name);
 
        mBtnGetBookList.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (connected) {
                    try {
                        bookList = bookController.getBookList();
                        for (int i = 0; i < bookList.size(); i++) {
                            Log.i("ruxing", "name=" + bookList.get(i).getName());
                        }
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnAddBook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (connected) {
                    Book book = new Book("新書");
                    try {
                        bookController.addBook(book);
                        Log.i("ruxing", "向服務(wù)器添加了一本新書==="+book.getName());
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnGetBookSize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (connected) {
                    try {
                        int size = 0;
                        size = bookController.getInt();
                        Log.i("ruxing", "共有" + size + "本書");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnGetFirstBookName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (connected) {
                    try {
                        String name = bookController.getString();
                        Log.i("ruxing", "第一本書的書名是:" + name);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
 
        Intent intent = new Intent();
        intent.setPackage("com.example.service");
        intent.setAction("com.example.service.action");
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
 
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (connected) {
            unbindService(serviceConnection);
        }
    }
}

完整的代碼地址:

https://github.com/ruxing1102/AIDL.git

到此這篇關(guān)于Android中AIDL的使用的文章就介紹到這了,更多相關(guān)Android AIDL使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決EditText編輯時hint 在6.0 手機(jī)上顯示不出來的問題

    解決EditText編輯時hint 在6.0 手機(jī)上顯示不出來的問題

    下面小編就為大家?guī)硪黄鉀QEditText編輯時hint 在6.0 手機(jī)上顯示不出來的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • android xml 定義漸變色背景的示例代碼

    android xml 定義漸變色背景的示例代碼

    在Android中,您可以使用XML來定義漸變色背景,以下是一個簡單的例子,展示了如何使用shape drawable來創(chuàng)建一個線性漸變背景,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 自定義視圖view的折線圖使用講解

    自定義視圖view的折線圖使用講解

    這篇文章主要介紹了自定義視圖view的折線圖使用講解,前面幾章講解了繪圖的一些基本用法,本章就來看看折線圖吧,需要的朋友可以參考下
    2023-04-04
  • Android根據(jù)輸入銀行卡號判斷屬于哪個銀行

    Android根據(jù)輸入銀行卡號判斷屬于哪個銀行

    這篇文章主要介紹了Android根據(jù)輸入銀行卡號判斷屬于哪個銀行的實(shí)現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Android自定義SurfaceView實(shí)現(xiàn)畫板功能

    Android自定義SurfaceView實(shí)現(xiàn)畫板功能

    這篇文章主要為大家詳細(xì)介紹了Android自定義SurfaceView實(shí)現(xiàn)畫板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android實(shí)現(xiàn)簡單的音樂播放器

    Android實(shí)現(xiàn)簡單的音樂播放器

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單的音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android開發(fā)之使用SQLite存儲數(shù)據(jù)的方法分析

    Android開發(fā)之使用SQLite存儲數(shù)據(jù)的方法分析

    這篇文章主要介紹了Android開發(fā)之使用SQLite存儲數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android使用SQLite數(shù)據(jù)庫實(shí)現(xiàn)針對數(shù)據(jù)的增刪改查操作相關(guān)技巧,需要的朋友可以參考下
    2017-07-07
  • Android room數(shù)據(jù)庫使用詳解

    Android room數(shù)據(jù)庫使用詳解

    這篇文章主要介紹了Android room數(shù)據(jù)庫使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Android使用jni調(diào)用c++/c方法詳解

    Android使用jni調(diào)用c++/c方法詳解

    這篇文章主要介紹了Android使用jni調(diào)用c++/c方法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • android文件存儲和SharedPreferences存儲的項目實(shí)例

    android文件存儲和SharedPreferences存儲的項目實(shí)例

    本文主要介紹了android文件存儲和SharedPreferences存儲的項目實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論