Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android AIDL遠程服務使用示例

Android AIDL遠程服務使用示例

編輯:初級開發

很多網友來函表示對Android AIDL不是很理解,這裡Android123准備了一個簡單的例子,幫助大家了解android上比較強大的遠程服務設計吧。

  一、為什麼要使用AIDL,他的優勢有哪些呢?

  AIDL服務更像是 一個Server,可以為多個應用提供服務。由於使用了IDL這樣類似COM組件或者說中間語言的設計,可以讓後續的開發者無需了解內部,根據暴漏的接口實現相關的操作,AIDL可以工作在獨立的進程中。

 二、學習AIDL服務需要有哪些前置知識?

  作為Android上服務的擴展,首先你要了解Android Service模型,Android Serivice我們可以分為兩種模式,三個類型,1.最簡單的Service就是無需處理onBind方法,一般使用廣播通訊,效率比較低。2. 使用Binder模式處理Service和其他組件比如Activity通訊,android開發網提示對於了解了Binder模式的服務後,開發AIDL遠程服務就輕松容易的多。

 三、具體實例,我們以com.android123.cwj.demo為工程名,首先在工程目錄的com.android123.cwj目錄下創建一個ICWJ.aidl文件,內容為

  package com.android123.cwj;

  interface ICWJ {

  String getName();

 } 

  如果格式AIDL格式沒有問題,在Eclipse中ADT插件會在工程的gen目錄下會自動生成一個Java實現文件。

 在Service中代碼如下:

 public class CWJService extends Service {
 
 public static final String BIND = "com.android123.cwj.CWJService.BIND"; 

 public String mName="android123";

 private final ICWJ.Stub mBinder = new ICWJ.Stub()
  {

     @Override
     public String getName() throws RemoteException
     {    //重寫在AIDL接口中定義的getName方法,返回一個值為我們的成員變量mName的內容。
        try
        {
          return CWJService.this.mName;
        }
        catch(Exception e)
        {
           return null;
        }
    }

};

  @Override
  public void onCreate() {
   Log.i("svc", "created.");
  }

  @Override
  public IBinder onBind(Intent intent) {
     return mBinder;    //這裡我們要返回mBinder而不是一般Service中的null
  }

 }

 接著在androidManifest.XML文件中定義

 <service android:name=".CWJService">
   <intent-filter>
    <action android:name="com.android123.cwj.CWJService.BIND" />
    <category android:name="android.intent.category.DEFAULT"/>
   </intent-filter>
  </service>

 接下來在Activity中的調用,我們可以

   private ICWJ objCWJ = null;

   private ServiceConnection serviceConn = new ServiceConnection() {

  @Override
  public void onServiceDisconnected(ComponentName name) {
   }

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   objCWJ = ICWJ.Stub.asInterface(service);
  }
 };

 在Activity的onCreate中加入綁定服務的代碼

  Intent intent = new Intent();
  intent.setClass(this, CWJService.class);
  bindService (intent, serviceConn, Context.BIND_AUTO_CREATE);

  同時重寫Activity的onDestory方法

    @Override
    public void onDestroy() {
         unbindService(serviceConn);  // 取消綁定
     super.onDestroy();
    }

 執行AIDL的getName可以通過下面的方法

   if (objCWJ == null)
   {
       try {
            String strName = obj.getName();
       }
       catch (RemoteException e)
       {}
   }

 以上過程中,如果ADT插件沒有自動生成ICWJStub類在工程的gen目錄下時,可以手動在sdk根目錄下platform-tools目錄下,手動實用AIDL.exe來生成,這樣可以看清楚AIDL文件到底是哪裡存在格式上的錯誤。有關AIDL中傳遞參數,實用復雜類型,還有導出成為獨立的進程,android123在明天給出另一個示例。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved