aidl實現步驟

什麼情況下要使用AIDL

  使用AIDL只有在你允許來自不同應用的客戶端跨進程通信訪問你的service,並且想要在你的service種處理多線程的時候纔是必要的。 如果你不需要執行不同應用之間的IPC併發,你應該通過實現Binder建立你的接口,或者如果你想執行IPC,但是不需要處理多線程。那麼使用Messenger實現你的接口。

定義一個AIDL接口的步驟

  必須在一個.aidl文件中使用Java編程語言語法定義你的AIDL接口,然後在提供service的應用中和任何綁定到這個service的應用中的源代碼中(在src目錄嚇)保存它。 
   
  當你編譯包含.aidl文件的應用時,Android SDK工具基於這個.aidl文件生成一個IBinder接口,並且把它保存到項目的gen目錄嚇.service必須恰當的實現這個IBinder接口 之後客戶端應用可以綁定到這個服務上,然後從IBinder調用方法來執行IPC。

使用AIDL建立一個鄰接的service需要遵循下面的步驟:

1. 建立.aidl文件 

  這個文件使用方法簽名定義了語言接口  
   
2.實現這個接口 

  Android SDk工具基於你的.aidl文件使用java語言生成一個接口 這個接口有一個內部抽象類,叫做Stub,它是繼承Binder並且實現你AIDL接口的 你必須繼承這個Stub類並且實現這些方法 
   
3.暴露這個接口給客戶端 

  實現一個service並且覆蓋onBind()方法返回你的Stub實現類。

你的.aidl文件必須被複制到其他應用程序中來讓他們訪問你service的接口,你必須維護原始接口的支持(向後兼容)

IService.aidl 
  


package com.example.aidl;


interface IService {

    String hello(String name); 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在server項目中建立服務類

  當你編譯你的應用時,Android SDK工具生成一個.java接口文件用你的.aidl文件命名生成的接口包含一個名字爲Stub的子類,這是一個它父類的抽象實現,並且聲明瞭.aidl中所有的方法。 
   
  Stub也定義了一些輔助的方法,最顯著的就是asInterface(),它是用來接收一個IBinder(通常IBinder傳遞給客戶端的onServiceConnected()回調方法)並且返回一個Stub接口的實例 。

  一旦你爲service實現了接口,你需要把它暴露給客戶端,這樣他們才能綁定到上面 爲了給你的service暴露接口,繼承Service並且實現onBind()方法返回一個你實現生成的Stub類。

   AIDLService.java

public class AIDLService extends Service {


    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Return the interface
        return new IService.Stub() {
            @Override
            public String hello(String name) throws RemoteException {
                // TODO Auto-generated method stub
                return "hello"+name;
            }
        };
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在server項目AndroidManifest中申明Service

<service 
  android:name="com.example.service.AIDLService" >
   <intent-filter>  
<action android:name="android.intent.action.AIDLService" />  
  </intent-filter> 
        </service>

MainActivity.java

public class MainActivity extends Activity {

    IService RemoteService; //監聽服務
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            Log.i("mConnection", service+"");
            RemoteService = IService.Stub.asInterface(service);

            try {
                String s= RemoteService.hello("finch");
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initService();
    }
    //連接服務
        private void initService() {
            Intent i = new Intent( );
            i.setAction("android.intent.action.AIDLService");
            boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
        }

        //斷開服務
        private void releaseService() {
            unbindService(mConnection);
            mConnection = null;
        }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseService();
    }
}
也可以參考:http://blog.csdn.net/u010513497/article/details/43701741
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章