最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android IPC進程間通信詳解最新AndroidStudio的AIDL操作)

 更新時間:2016年09月19日 09:06:15   作者:SillyMonkey  
這篇文章主要介紹了Android IPC進程間通信的相關(guān)資料,需要的朋友可以參考下

前言

前面梳理了Android的線程間的通信《Thread、Handler和HandlerThread關(guān)系何在?》 ,這些都是在同一個進程中,那進程間的通信,或者說不同的應用間的通信該如何實現(xiàn)呢?這個時候就要用到AIDL(Android Interface Definition LanguageAndroid接口定義語言 )。

使用方法(AndroidStudio)

我發(fā)現(xiàn)現(xiàn)在AIDL的教程基本上還是eclipse的,但是在AndroidStudio里面使用AIDL還是有一些不同的,來看看怎么用,首先新建一個工程當做server服務端:

創(chuàng)建好后在任意文件夾右鍵New-->AIDL-->AIDL File,編輯文件名后會自動在src/main目錄下面新建aidl文件夾,包的目錄結(jié)構(gòu)如下:

main
aidl
com.example.tee.testapplication.aidl
java
com.example.tee.testapplication
res
AndroidManifest.xml

自動生成的aidl文件如下:

// AidlInterface.aidl
package com.example.tee.testapplication.aidl;

// Declare any non-default types here with import statements

interface AidlInterface {
 /**
 * 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);
}

我們可以看到aidl文件的代碼格式跟java很像,支持java的基礎類型以及List、Map等,如果是自定義類的話需要手動導入,我們后面再說,先來最簡單的,新建一個 IMyAidlInterface.aidl文件,修改如下:

package com.example.tee.testapplication.aidl;

interface IMyAidlInterface {
 String getValue();
}

在接口中定義一個getValue方法,返回一個字符串,現(xiàn)在可以編譯一下工程,找到app/build/generated/source/aidl/debug目錄,在我們應用包名下會發(fā)現(xiàn)生成了一個Interface類,名字跟我們定義的aidl的文件名字一樣,這說明其實aidl文件在最后還是會轉(zhuǎn)換成接口來實現(xiàn),而且這個文件不需要我們維護,在編譯后自動生成。

然后新建一個類繼承Service:

public class MAIDLService extends Service{
 public class MAIDLServiceImpl extends IMyAidlInterface.Stub{
 @Override
 public String getValue() throws RemoteException {
 return "get value";
 }
 }
 @Nullable
 @Override
 public IBinder onBind(Intent intent) {
 return new MAIDLServiceImpl();
 }
}

在MAIDLService類中定義一個內(nèi)部類繼承IMyAidlInterface.Stub,并且重寫我們在aidl也就是在接口中定義的getValue方法,返回字符串get value。

到了這里,我們就新建好了這個服務端,作用是在調(diào)用后返回一個字符串,最后在AndroidManifest文件中聲明:

<service
 android:name=".MAIDLService"
 android:process=":remote"http://加上這句的話客戶端調(diào)用會創(chuàng)建一個新的進程
 android:exported="true"http://默認就為true,可去掉,聲明是否可以遠程調(diào)用
 >
 <intent-filter>
 <category android:name="android.intent.category.DEFAULT" />
 <action android:name="com.example.tee.testapplication.aidl.IMyAidlInterface" />
 </intent-filter>
</service>

android:process=":remote"這一行的作用是聲明是否調(diào)用時新建進程,接下來寫客戶端代碼,新建一個工程,將剛才創(chuàng)建的aidl文件拷貝到這個工程中,注意同樣也是要放在aidl文件夾下,然后在MainActivity中編寫代碼如下:

public class MainActivity extends AppCompatActivity {
 private TextView mValueTV;
 private IMyAidlInterface mAidlInterface = null;
 private ServiceConnection mServiceConnection = new ServiceConnection() {
 @Override
 public void onServiceConnected(ComponentName name, IBinder service) {
 mAidlInterface = IMyAidlInterface.Stub.asInterface(service);
 }

 @Override
 public void onServiceDisconnected(ComponentName name) {

 }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 Intent intent = new Intent("com.example.tee.testapplication.aidl.IMyAidlInterface");
 bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
 mValueTV = (TextView) findViewById(R.id.tv_test_value);
 mValueTV.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 try {
  mValueTV.setText(mAidlInterface.getValue());
 } catch (RemoteException e) {
  e.printStackTrace();
 }
 }
 });
 }

 @Override
 protected void onDestroy() {
 if(mAidlInterface != null){
 unbindService(mServiceConnection);
 }
 super.onDestroy();
 }
}

注意這里新建Intent的傳入的參數(shù)字符串是在manifest里面自定義的action標簽,并且在onDestroy記得取消綁定服務。

執(zhí)行結(jié)果就是我們在點擊TextView時會顯示服務端給我們返回的get value字符串

自定義的對象

剛才我們使用的是基礎類型String,在使用我們自己定義的類的時候用上面的方法是不行的,用我們自定義的類需要手動導入,修改剛才我們創(chuàng)建的作為服務端的工程

首先在開始生成的aidl包下(所有aidl相關(guān)的文件都要放在這個包下)新建Student.java

public class Student implements Parcelable{
 public String name;
 public int age;
 protected Student(Parcel in) {
 readFromParcel(in);
 }
 public Student() {
 }

 public static final Creator<Student> CREATOR = new Creator<Student>() {
 @Override
 public Student createFromParcel(Parcel in) {
 return new Student(in);
 }

 @Override
 public Student[] newArray(int size) {
 return new Student[size];
 }
 };

 @Override
 public int describeContents() {
 return 0;
 }

 @Override
 public void writeToParcel(Parcel dest, int flags) {
 dest.writeInt(age);
 dest.writeString(name);
 }

 public void readFromParcel(Parcel in){
 age = in.readInt();
 name = in.readString();
 }

 @Override
 public String toString() {
 return String.format(Locale.ENGLISH, "STUDENT[%s:%d]", name, age);
 }
}

需要實現(xiàn)Parcelable序列化接口,AndroidStudio會自動生成靜態(tài)內(nèi)部類CREATOR和describeContents方法,這些部分我們都不需要修改,用自動生成的就好。然后重寫writeToParcel方法,自定義readFromParcel方法,注意這兩個方法里面的屬性順序必須一致,一個是寫入,一個是讀取。在構(gòu)造方法Student(Parcel in)中調(diào)用readFromParcel(in)方法。

接下來新建Student.aidl文件(也是在aidl包中):

// Student.aidl
package com.example.tee.testapplication.aidl;

// Declare any non-default types here with import statements
parcelable Student;

注意這里Student前面的關(guān)鍵字parcelable首字母是小寫哦,再修改IMyAidlInterface.aidl文件如下:

// IMyAidlInterface.aidl
package com.example.tee.testapplication.aidl;

// Declare any non-default types here with import statements
import com.example.tee.testapplication.aidl.Student;

interface IMyAidlInterface {
 Student getStudent();
 void setStudent(in Student student);
 String getValue();
}

定義了兩個方法,一個是設置Student,一個是獲取Student,在setStudent這個方法注意參數(shù)在類型前面有個in關(guān)鍵字,在aidl里參數(shù)分為in輸入,out輸出

現(xiàn)在在MAIDLService.java中重寫新加的兩個方法:

private Student mStudent;
public class MAIDLServiceImpl extends IMyAidlInterface.Stub{


 @Override
 public Student getStudent() throws RemoteException {
 return mStudent;
 }

 @Override
 public void setStudent(Student student) throws RemoteException {
 mStudent = student;
 }

 @Override
 public String getValue() throws RemoteException {
 return "get value : " + Thread.currentThread().getName() + Thread.currentThread().getId();
 }
}

服務端代碼修改完畢,來到客戶端工程,同樣要把剛才的aidl包下的文件拷貝覆蓋過來,保持兩邊一致,然后在MainActivity.java中修改如下:

mValueTV = (TextView) findViewById(R.id.tv_test_value);
mStudentTV = (TextView) findViewById(R.id.tv_test_student);
mValueTV.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 try {
 mValueTV.setText(mAidlInterface.getValue());
 } catch (RemoteException e) {
 e.printStackTrace();
 }
 }
});
mStudentTV.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 try {
 Student student = new Student();
 student.age = 10;
 student.name = "Tom";
 mAidlInterface.setStudent(student);
 mStudentTV.setText(mAidlInterface.getStudent().toString());
 } catch (RemoteException e) {
 e.printStackTrace();
 }
 }
});

現(xiàn)在編譯工程,會發(fā)現(xiàn)工程會報錯,找不到類Student,我們需要在app目錄下的build.gradle文件添加代碼如下:

android {
 sourceSets {
 main {
 manifest.srcFile 'src/main/AndroidManifest.xml'
 java.srcDirs = ['src/main/java', 'src/main/aidl']
 resources.srcDirs = ['src/main/java', 'src/main/aidl']
 aidl.srcDirs = ['src/main/aidl']
 res.srcDirs = ['src/main/res']
 assets.srcDirs = ['src/main/assets']
 }
 }
}

也就是指定一下文件目錄,現(xiàn)在再編譯就沒有問題了

總結(jié)

Android的IPC使用起來還是挺簡單的,AIDL文件的語法也跟我們平時使用接口的時候很相似,但是它只支持基礎類型,只能引用AIDL文件,需要使用自定義類的時候要稍微麻煩一點。

以上就是對Android IPC 進程通信的資料整理,后續(xù)繼續(xù)補充相關(guān)資料謝謝大家對本站的支持!

相關(guān)文章

  • Android程序設計之AIDL實例詳解

    Android程序設計之AIDL實例詳解

    這篇文章主要介紹了Android程序設計的AIDL,以一個完整實例的形式較為詳細的講述了AIDL的原理及實現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • Android中使用AsyncTask實現(xiàn)文件下載以及進度更新提示

    Android中使用AsyncTask實現(xiàn)文件下載以及進度更新提示

    AsyncTask,它使創(chuàng)建需要與用戶界面交互的長時間運行的任務變得更簡單,本篇文章主要介紹了Android中使用AsyncTask實現(xiàn)文件下載以及進度更新提示,有興趣的可以了解一下。
    2016-12-12
  • Android進階事件分發(fā)機制解決事件沖突

    Android進階事件分發(fā)機制解決事件沖突

    這篇文章主要為大家介紹了Android進階事件分發(fā)機制解決事件沖突過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Flutter 首頁必用組件NestedScrollView的示例詳解

    Flutter 首頁必用組件NestedScrollView的示例詳解

    今天介紹的組件是NestedScrollView,大部分的App首頁都會用到這個組件。對Flutter 首頁必用組件NestedScrollView的相關(guān)知識感興趣的一起看看吧
    2020-05-05
  • Android實現(xiàn)中國象棋游戲(局域網(wǎng)版)

    Android實現(xiàn)中國象棋游戲(局域網(wǎng)版)

    這篇文章主要為大家詳細介紹了Android實現(xiàn)局域網(wǎng)版的中國象棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android編程中自定義dialog用法實例

    Android編程中自定義dialog用法實例

    這篇文章主要介紹了Android編程中自定義dialog用法,結(jié)合實例形式較為詳細的分析了Android自定義dialog的定義.布局及調(diào)用等相關(guān)技巧,需要的朋友可以參考下
    2015-12-12
  • Android 動畫之AlphaAnimation應用詳解

    Android 動畫之AlphaAnimation應用詳解

    本節(jié)講解AlphaAnimation 動畫,窗口的動畫效果,淡入淡出什么的,有些游戲的歡迎動畫,logo的淡入淡出效果就使用AlphaAnimation,具體的祥看本文,需要的朋友可以參考下
    2012-12-12
  • 快速解決進入fragment時不能彈出軟件盤的問題

    快速解決進入fragment時不能彈出軟件盤的問題

    下面小編就為大家?guī)硪黄焖俳鉀Q進入fragment時不能彈出軟件盤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android提高之TelephonyManager功能探秘

    Android提高之TelephonyManager功能探秘

    這篇文章主要介紹了Android的TelephonyManager功能,可以幫助讀者更好的理解Java反射機制,需要的朋友可以參考下
    2014-08-08
  • Android仿京東搜索框漸變效果

    Android仿京東搜索框漸變效果

    這篇文章主要為大家詳細介紹了Android仿京東搜索框漸變效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

罗平县| 墨脱县| 社会| 玉树县| 玛曲县| 沙河市| 尚志市| 吉水县| 林口县| 吐鲁番市| 孟州市| 晋中市| 黄龙县| 德化县| 鸡东县| 万州区| 建宁县| 曲阜市| 如皋市| 彭州市| 和顺县| 土默特左旗| 安顺市| 红桥区| 郎溪县| 金川县| 南开区| 呼和浩特市| 景洪市| 翼城县| 石柱| 牙克石市| 尉氏县| 景德镇市| 梁河县| 北碚区| 宜春市| 太湖县| 沁阳市| 滦平县| 遂平县|