国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android 進程間通信(AIDL)使用詳解

遠程Service與Activity的交互(AIDL的應用)

首先我們先上一個通俗的情景:在應用1中Activity綁定了一個Service,并且設置了一些值,此時我們想在應用2中調(diào)用該service并且想得到該值應該怎么做?我們都知道每個應用程序都運行在各自的進程中,并且android平臺是不允許不同進程間進行直接的對象數(shù)據(jù)等傳遞的。如果必須進行跨進程之間的數(shù)據(jù)傳遞,那么我們就應該使用AIDL(Android Interface Definition Language)。

AIDL只支持方法,不能定義靜態(tài)成員,并且方法也不能有類似public等的修飾符;AIDL運行方法有任何類型的參數(shù)和返回值,在java的類型中,以下的類型使用時不需要導入包(import),基本數(shù)據(jù)類型、String、Map、List.當然為了避免出錯,建議只要使用了,就導入包。

使用AIDL的步驟:

       服務端(提供服務):

        第1步:定義一個*.aidl文件,該文件里是符合aidl語言規(guī)范的接口定義,里面定義了外部應用可以訪問的方法。當我們保存該文件的時候,eclipse會自動為我們在gen文件夾下生成一個相應的java接口文件。如:

  1. package com.android.macdroid;  
  2. interface IPerson {   
  3.     void setValue(String name);  
  4.     String getValue();   
  5. }  

    第2步:實現(xiàn)AIDL文件生成的JAVA接口Stub

  1. class Person extends IPerson.Stub {  
  2.     private String name;  
  3.      
  4.     @Override  
  5.     public void setValue(String name) throws RemoteException {  
  6.        this.name = name ;  
  7.     }  
  8.   
  9.     @Override  
  10.     public String getValue() throws RemoteException {  
  11.         return name;  
  12.     }  
  13.       
  14. }  

     第3步:定義一個自己的service,    并將其注冊到androidManifest.xml文件中,例如:

  1. public class ServiceC extends Service {    
  2.     private Stub iPerson = new Person();    
  3.     @Override    
  4.     public IBinder onBind(Intent arg0) {    
  5.         Log.i("service", "onBind...");    
  6.         return iPerson;    
  7.     }    
  8. }   
  1. <service android:name="com.android.macdroid.ServiceC" >  
  2.            <intent-filter >  
  3.                <action android:name="forServiceAidl" > </action>  
  4.            </intent-filter>  
  5.        </service>  

       我們都知道,在實現(xiàn)自己的service時,為了其他應用可以通過bindService來和我們的service進行交互,我們都要實現(xiàn)service中的onBind()方法,并且返回一個繼承了Binder的內(nèi)部類;在這里,eclipse自動為我們生成的RemoteServiceInterface.java中有一個實現(xiàn)了Binder的內(nèi)部類,RemoteServiceInterface.Stub。AIDL要求我們,在這里不能再直接去實現(xiàn)Binder類了,而是去實現(xiàn),AIDL提供給我們的Stub類。 實現(xiàn)stub類的同時,AIDL還要求我們同時實現(xiàn)我們在接口中定義的各種服務的具體實現(xiàn)。至此為止,我們的服務端已經(jīng)和我們的aidl文件綁定到一起了哦。

同一個應用中的Activity為該Service中賦值:

  1. package com.android.macdroid;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Service;  
  5. import android.content.ComponentName;  
  6. import android.content.DialogInterface;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.content.Intent;  
  10. import android.content.ServiceConnection;  
  11. import android.os.Bundle;  
  12. import android.os.IBinder;  
  13. import android.os.RemoteException;  
  14. import android.widget.Button;  
  15. import android.widget.Toast;  
  16. import com.android.macdroid.IPerson;  
  17.   
  18. public class AIDLTestActivity extends Activity  {  
  19.   
  20.     private IPerson iPerson;  
  21.     private Button bindBtn, unbindBtn;   
  22.   
  23.     private ServiceConnection conn = new ServiceConnection() {  
  24.   
  25.         // 斷開連接時調(diào)用  
  26.         @Override  
  27.         public void onServiceDisconnected(ComponentName arg0) {  
  28.         }  
  29.   
  30.         // 連接時調(diào)用  
  31.         @Override  
  32.         public void onServiceConnected(ComponentName arg0, IBinder binder) {  
  33.             iPerson = IPerson.Stub.asInterface(binder);  
  34.             if (iPerson != null) {  
  35.                 try {  
  36.                     iPerson.setValue("Service AIDL");  
  37.                     Toast.makeText(AIDLTestActivity.this, "賦值成功!",  
  38.                             Toast.LENGTH_LONG).show();  
  39.                 } catch (RemoteException e) {  
  40.                     e.printStackTrace();  
  41.                     Toast.makeText(AIDLTestActivity.this, "賦值失敗!",  
  42.                             Toast.LENGTH_LONG).show();  
  43.                 }  
  44.             }  
  45.         }  
  46.     };  
  47.   
  48.     @Override  
  49.     public void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.         setContentView(R.layout.main);  
  52.         bindBtn = (Button) findViewById(R.id.bindBtn);  
  53.         unbindBtn = (Button) findViewById(R.id.unbindBtn);  
  54.         bindBtn.setOnClickListener((android.view.View.OnClickListener) listener);  
  55.         bindBtn.setOnClickListener(listener);  
  56.         unbindBtn.setOnClickListener(listener);  
  57.     }  
  58.     private OnClickListener listener = new OnClickListener() {    
  59.   
  60.         @Override  
  61.         public void onClick(View v) {  
  62.             // TODO Auto-generated method stub  
  63.               switch (v.getId()) {    
  64.                 case R.id.bindBtn:    
  65.                     //本應用中需要在manifest中配置RemoteService    
  66.                     bindService(new Intent("forServiceAidl"), conn, Service.BIND_AUTO_CREATE);    
  67.                     break;    
  68.                 case R.id.unbindBtn:    
  69.                     unbindService(conn);    
  70.                     break;    
  71.                 default:    
  72.                     break;    
  73.                 }    
  74.         }  
  75.   
  76.     };   
  77.   
  78. }  




客戶端:
      
第1步:客戶端要想使用該服務,肯定要先知道我們的服務在aidl文件中到底對外提供了什么服務,對吧?所以,第一步,我們要做的就是,將aidl文件拷貝一份到客戶端的程序中(這里一定要注意,包路徑要和服務端的保持一致哦,例如服務端為cn.com.chenzheng_java.remote.a.aidl,那么在客戶端這邊也應該是這個路徑)。

      第2步:我們都知道,想要和service交互,我們要通過bindService方法,該方法中有一個ServiceConnection類型的參數(shù)。而我們的主要代碼便是在該接口的實現(xiàn)中。

     
第3步:在ServiceConnection實現(xiàn)類的onServiceConnected(ComponentName name, IBinder service)方法中通過類似remoteServiceInterface = RemoteServiceInterface.Stub.asInterface(service);方式就可以獲得遠程服務端提供的服務的實例,然后我們就可以通過remoteServiceInterface 對象調(diào)用接口中提供的方法進行交互了。(這里的關(guān)鍵是通過*.Stub.asInterface(service);方法獲取一個aidl接口的實例哦)

       我們前面在服務端中說過了,必須提供一個intent-filter來匹配請求是否合法,所以我們在客戶端訪問服務的時候,還必須傳遞包含了匹配action的Intent哦。

客戶端中使用服務端中的service范例:

  1. private ServiceConnection conn = new ServiceConnection() {    
  2.      @Override    
  3.      public void onServiceDisconnected(ComponentName arg0) {    
  4.      }    
  5.      //因為有可能有多個應用同時進行RPC操作,所以同步該方法    
  6.      @Override    
  7.      public synchronized void onServiceConnected(ComponentName arg0, IBinder binder) {    
  8.          //獲得IPerson接口    
  9.          person = IPerson.Stub.asInterface(binder);    
  10.          if(person != null){    
  11.              try {    
  12.                  //RPC方法調(diào)用    
  13.                  String name = person.getValue();    
  14.                  Toast.makeText(DemoAIDLActivity.this, "遠程進程調(diào)用成功!值為 : "+name, Toast.LENGTH_LONG).show();    
  15.              } catch (RemoteException e) {    
  16.                  e.printStackTrace();      
  17.                  Toast.makeText(DemoAIDLActivity.this, "遠程進程調(diào)用失敗! ", Toast.LENGTH_LONG).show();    
  18.              }    
  19.          }    
  20.      }  
  21.  };    
  22.      
  23.  @Override    
  24.  public void onCreate(Bundle savedInstanceState) {    
  25.      super.onCreate(savedInstanceState);    
  26.      setContentView(R.layout.main);    
  27.      btn = (Button)findViewById(R.id.btn);    
  28.      btn.setOnClickListener(new OnClickListener() {    
  29.          @Override    
  30.          public void onClick(View arg0) {    
  31.              //該應用中不需要在manifest中配置RemoteService    
  32.              bindService(new Intent("forServiceAidl"), conn, Service.BIND_AUTO_CREATE);    
  33.          }    
  34.      });    
  35.  }    


參考博客:Android Service學習之AIDL, Parcelable和遠程服務 


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
android service中stub作用是什么?
Android使用AIDL設計和調(diào)用遠程接口
[z]Android Service學習之AIDL, Parcelable和遠程服務
Binder:為什么要通過onTransact()調(diào)用目標方法
4.2.3 Service精通
Android 添加系統(tǒng)服務
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服