国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android中的AIDL進程間通信示例

2019-12-12 04:47:11
字體:
來源:轉載
供稿:網(wǎng)友

關于IPC應該不用多介紹了,Android系統(tǒng)中的進程之間不能共享內(nèi)存,那么如果兩個不同的應用程序之間需要通訊怎么辦呢?比如公司的一個項目要更新,產(chǎn)品的需求是依附于當前項目開發(fā)一個插件,但是呢這個插件功能以及界面比較復雜,不能和當前項目在一個進程中,同時呢,還要用到當前項目中已經(jīng)寫好了的一些東西,那么因為新開發(fā)的依附于當前項目的插件和當前項目不是一個進程,因此不能共享內(nèi)存,就出現(xiàn)了問題,于是,需要提供一些機制在不同進程之間進行數(shù)據(jù)通信,這個機制就是AIDL了。

一、一個android中AIDL的簡單例子

假如是這樣,現(xiàn)在有一個項目中提供了比較成熟的計算的方法,而現(xiàn)在我想開發(fā)一款軟件其中一個模塊想用到一個計算類,而我又不想重新寫了,那么就可以通過AIDL實現(xiàn)啦。假設,已經(jīng)開發(fā)完成的那個已經(jīng)提供了比較成熟的計算類的程序叫AIDLCalculateDemoServer(相當于服務器),而我要寫的程序叫AIDLCalculateDemoClient(相當于客戶端),類似與客戶端服務器模式。首先至關的看下工程結構圖:
                                     圖1-1 服務器                                                       圖1-2 客戶端 

現(xiàn)在假設自己寫的程序要調(diào)用服務端的運算界面,輸入num1和num2,進行遠程運算,調(diào)用服務端的接口,服務端運算好之后,返回結果給客戶端,效果圖如下:
然后來看看實現(xiàn),首先需要定義AIDL接口,客戶端和服務器端都要定義,并且要在同一包中,也就是圖1-1和圖1-2 com.example.aidl.calculate中的CalculateInterface,其中的代碼如下:

package com.example.aidl.calculate;interface CalculateInterface {  double doCalculate(double a, double b); }

編譯發(fā)現(xiàn),目錄結構如圖1-1和圖1-2中gen/com.example.aidl.calculate中多了CalculateInterface.java文件,內(nèi)容如下:

 package com.example.aidl.calculate; interface CalculateInterface {   double doCalculate(double a, double b); }

定義好接口就是要看服務端和客戶端的代碼啦,其中服務端主要看CalculateService代碼,這個一個繼承Service的類,在其中對AIDL中的接口進行賦予實際意義,如下:

 package com.example.calculate;import com.example.aidl.calculate.CalculateInterface;import com.example.aidl.calculate.CalculateInterface.Stub;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class CalculateService extends Service {    private static final String              TAG            =  "CalculateService";    @Override  public IBinder onBind(Intent arg0) {    // TODO Auto-generated method stub    logE("onBind()");    return mBinder;  }    @Override  public void onCreate() {    // TODO Auto-generated method stub    logE("onCreate()");    super.onCreate();  }    @Override  public void onStart(Intent intent, int startId) {    // TODO Auto-generated method stub    logE("onStart()");    super.onStart(intent, startId);  }    @Override  public boolean onUnbind(Intent intent) {    // TODO Auto-generated method stub    logE("onUnbind()");    return super.onUnbind(intent);  }    @Override  public void onDestroy() {    // TODO Auto-generated method stub    logE("onDestroy()");    super.onDestroy();  }    private static void logE(String str) {    Log.e(TAG, "--------" + str + "--------");  }    private final CalculateInterface.Stub mBinder = new CalculateInterface.Stub() {        @Override    public double doCalculate(double a, double b) throws RemoteException {      // TODO Auto-generated method stub      Log.e("Calculate", "遠程計算中");      Calculate calculate = new Calculate();      double answer = calculate.calculateSum(a, b);      return answer;    }  };}

然后可以看看,關鍵的服務都提供完畢,那么在客戶端是怎么訪問的呢,要進行綁定服務和一個ServiceConnection類完成,如下:

package com.example.calculate;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Color;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.example.aidl.calculate.CalculateInterface;import com.example.aidlcalculatedemoclient.R;public class CalculateClient extends Activity {  private static final String         TAG            =      "CalculateClient";    private       Button         btnCalculate;    private       EditText        etNum1;    private         EditText        etNum2;    private       TextView        tvResult;    private        CalculateInterface   mService;    private       ServiceConnection    mServiceConnection = new ServiceConnection() {        @Override    public void onServiceDisconnected(ComponentName name) {      // TODO Auto-generated method stub      logE("disconnect service");      mService = null;    }        @Override    public void onServiceConnected(ComponentName name, IBinder service) {      // TODO Auto-generated method stub      logE("connect service");      mService = CalculateInterface.Stub.asInterface(service);    }  };    @Override  protected void onCreate(Bundle savedInstanceState) {    // TODO Auto-generated method stub    super.onCreate(savedInstanceState);    setContentView(R.layout.main);        Bundle args = new Bundle();    Intent intent = new Intent("com.example.calculate.CalculateService");    intent.putExtras(args);    bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);        etNum1 = (EditText) findViewById(R.id.et_num_one);    etNum2 = (EditText) findViewById(R.id.et_num_two);        tvResult = (TextView) findViewById(R.id.tv_result);        btnCalculate = (Button) findViewById(R.id.btn_cal);        btnCalculate.setOnClickListener(new View.OnClickListener() {            @Override      public void onClick(View v) {        // TODO Auto-generated method stub                logE("開始遠程運算");        try {          double num1 = Double.parseDouble(etNum1.getText().toString());          double num2 = Double.parseDouble(etNum2.getText().toString());          String answer = "計算結果:" + mService.doCalculate(num1, num2);          tvResult.setTextColor(Color.BLUE);          tvResult.setText(answer);                      } catch (RemoteException e) {        }      }    });  }    private void logE(String str) {    Log.e(TAG, "--------" + str + "--------");  }}

如此一來,大功已經(jīng)基本告成,最后,我們在來看看服務端的配置文件吧:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.aidlcaculatedemoserver"  android:versionCode="1"  android:versionName="1.0" >  <uses-sdk    android:minSdkVersion="8"    android:targetSdkVersion="17" />  <application    android:allowBackup="true"    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppTheme" >    <activity      android:name="com.example.aidlcaculatedemoserver.MainActivity"      android:label="@string/app_name" >      <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>    </activity>    <service android:name="com.example.calculate.CalculateService">      <intent-filter>        <action android:name="com.example.calculate.CalculateService" />      </intent-filter>    </service>  </application></manifest>

二、寫AIDL注意事項

1. 客戶端和服務端的AIDL接口文件所在的包必須相同

2. 需要一個Service類的配合

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 滨海县| 海淀区| 金堂县| 乡城县| 临海市| 东宁县| 句容市| 阳城县| 山丹县| 玉林市| 边坝县| 金坛市| 公主岭市| 涿鹿县| 临潭县| 盱眙县| 永兴县| 沙湾县| 清徐县| 徐水县| 武川县| 汨罗市| 离岛区| 门头沟区| 东宁县| 容城县| 会宁县| 铁岭市| 济源市| 万载县| 株洲县| 从江县| 辉南县| 桑日县| 鹤山市| 额济纳旗| 玉林市| 惠来县| 惠州市| 青州市| 吐鲁番市|