小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
          http://book.51cto.com/art/201006/207070.htm

          建立AIDL服務的步驟(1)

          建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下:

          (1)在Eclipse Android工程的Java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似于Java代碼,但會稍有不同。詳細介紹見實例52的內容。

          (2)如果aidl文件的內容是正確的,ADT會自動生成一個Java接口文件(*.java)。

          (3)建立一個服務類(Service的子類)。

          (4)實現由aidl文件生成的Java接口。

          (5)在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。這一點將在實例52和實例53中看到。

          實例52:建立AIDL服務

          AIDL服務工程目錄:src\ch08\ch08_aidl

          客戶端程序工程目錄:src\ch08\ch08_aidlclient

          本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務后,會在客戶端調用這個getValue方法,并將返回值在TextView組件中輸出。建立這個AIDL服務的步驟如下:

          (1)建立一個aidl文件。在Java包目錄中建立一個IMyService.aidl文件。IMyService.aidl文件的位置如圖8.24所示。

            
          圖8.24  IMyService.aidl文件的位置
          IMyService.aidl文件的內容如下:
          1. package net.blogjava.mobile.aidl;  
          2. interface IMyService  
          3. {  
          4.     String getValue();  

          IMyService.aidl文件的內容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務不支持的數據類型(例如,InputStream、OutputStream)等內容。

          (2)如果IMyService.aidl文件中的內容輸入正確,ADT會自動生成一個IMyService.java文件。讀者一般并不需要關心這個文件的具體內容,也不需要維護這個文件。關于該文件的具體內容,讀者可以查看本節提供的源代碼。

          (3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:

          1. package net.blogjava.mobile.aidl;  
          2.  
          3. import android.app.Service;  
          4. import android.content.Intent;  
          5. import android.os.IBinder;  
          6. import android.os.RemoteException;  
          7.  
          8. public class MyService extends Service  
          9. {   
          10.     public class MyServiceImpl extends IMyService.Stub  
          11.     {  
          12.         @Override  
          13.         public String getValue() throws RemoteException  
          14.         {  
          15.             return "Android/OPhone開發講義";  
          16.         }  
          17.     }  
          18.     @Override  
          19.     public IBinder onBind(Intent intent)  
          20.     {          
          21.         return new MyServiceImpl();  
          22.     }  

          在編寫上面代碼時要注意如下兩點:

          IMyService.Stub是根據IMyService.aidl文件自動生成的,一般并不需要管這個類的內容,只需要編寫一個繼承于IMyService.Stub類的子類(MyServiceImpl類)即可。

          onBind方法必須返回MyServiceImpl類的對象實例,否則客戶端無法獲得服務對象。

          (4)在AndroidManifest.xml文件中配置MyService類,代碼如下:

          1. <service android:name=".MyService" > 
          2.     <intent-filter>   
          3.         <action android:name="net.blogjava.mobile.aidl.IMyService" /> 
          4.     </intent-filter> 
          5. </service> 

          其中"net.blogjava.mobile.aidl.IMyService"是客戶端用于訪問AIDL服務的ID。

          下面來編寫客戶端的調用代碼。首先新建一個Eclipse Android工程(ch08_aidlclient),并將自動生成的IMyService.java文件連同包目錄一起復制到ch08_aidlclient工程的src目錄中,如圖8.25所示。

            
          圖8.25  IMyService.java文件
          在ch08_aidlclient工程中的位置
          調用AIDL服務首先要綁定服務,然后才能獲得服務對象,代碼如下:

          1. package net.blogjava.mobile;  
          2.  
          3. import net.blogjava.mobile.aidl.IMyService;  
          4. import android.app.Activity;  
          5. import android.content.ComponentName;  
          6. import android.content.Context;  
          7. import android.content.Intent;  
          8. import android.content.ServiceConnection;  
          9. import android.os.Bundle;  
          10. import android.os.IBinder;  
          11. import android.view.View;  
          12. import android.view.View.OnClickListener;  
          13. import android.widget.Button;  
          14. import android.widget.TextView;  
          15.  
          16. public class Main extends Activity implements OnClickListener  
          17. {  
          18.     private IMyService myService = null;  
          19.     private Button btnInvokeAIDLService;  
          20.     private Button btnBindAIDLService;   
          21.     private TextView textView;  
          22.     private ServiceConnection serviceConnection = 
            new ServiceConnection()  
          23.     {  
          24.         @Override  
          25.         public void onServiceConnected(ComponentName 
            name, IBinder service)  
          26.         {  
          27.             //  獲得服務對象  
          28.             myService = IMyService.Stub.asInterface(service);  
          29.             btnInvokeAIDLService.setEnabled(true);  
          30.         }  
          31.         @Override  
          32.         public void onServiceDisconnected(ComponentName name)  
          33.         {  
          34.         }  
          35.     };  
          36.     @Override  
          37.     public void onClick(View view)  
          38.     {  
          39.         switch (view.getId())  
          40.         {  
          41.             case R.id.btnBindAIDLService:  
          42.                 //  綁定AIDL服務  
          43.                 bindService(new Intent("net.blogjava.
            mobile.aidl.IMyService"),  
          44.                         serviceConnection, Context.BIND_AUTO_CREATE);  
          45.                 break;  
          46.             case R.id.btnInvokeAIDLService:  
          47.                 try  
          48.                 {  
          49.                     textView.setText(myService.
            getValue());     //  調用服務端的getValue方法  
          50.                 }  
          51.                 catch (Exception e)  
          52.                 {  
          53.                 }  
          54.                 break;  
          55.         }  
          56.     }  
          57.     @Override  
          58.     public void onCreate(Bundle savedInstanceState)  
          59.     {  
          60.         super.onCreate(savedInstanceState);  
          61.         setContentView(R.layout.main);  
          62.         btnInvokeAIDLService = (Button) findViewById
            (R.id.btnInvokeAIDLService);  
          63.         btnBindAIDLService = (Button) findViewById
            (R.id.btnBindAIDLService);  
          64.         btnInvokeAIDLService.setEnabled(false);  
          65.         textView = (TextView) findViewById(R.id.textview);  
          66.         btnInvokeAIDLService.setOnClickListener(this);  
          67.         btnBindAIDLService.setOnClickListener(this);  
          68.     }  
          posted on 2010-11-19 16:56 小菜毛毛 閱讀(1152) 評論(0)  編輯  收藏 所屬分類: andriod
          主站蜘蛛池模板: 平江县| 柳州市| 青浦区| 凤城市| 阳春市| 桑植县| 阳泉市| 寻乌县| 东城区| 周口市| 德令哈市| 荆门市| 砚山县| 礼泉县| 安陆市| 安福县| 桂阳县| 新源县| 如皋市| 乡宁县| 南皮县| 昌平区| 微博| 雷山县| 东乡县| 唐海县| 会泽县| 沾化县| 五原县| 旅游| 广州市| 白河县| 巩义市| 韩城市| 大同县| 射洪县| 临夏市| 临汾市| 定襄县| 乌拉特前旗| 浦县|