【專題】Android AIDL使用

文章不講如何簡單的建立AIDL,會使用項目中實際的例子來講如何使用,也方便了解了AIDL的同窗殊不知道在什麼狀況下使用的。    
html

先來了解下AIDL,英文全稱叫Android Interface definition language,是Android系統內部進程通訊接口的描述語言,它做爲兩個進程間通信的接口。    java

下面就來介紹一個項目中實際使用AIDL的例子。    android

客戶需求能夠在第三方APP裏調用系統設置的接口,若是要達到這個目的,因爲是第三方APP(即便用Android SDK開發的APP),沒法直接調用這些系統接口(包括權限問題,隱藏API問題),只有經過在系統設置裏面建立AIDL服務接口,在第三方APP裏面調用這些接口,就能實現客戶的需求。    app

那麼AIDL工做的方式是什麼呢?你能夠理解爲一個服務端,一個客戶端,客戶端請求服務端調用工做,若是有必要服務端還會調用客戶端提供的接口。    ide

首先來看服務端該作什麼ui

路徑:/packages/apps/Settingsspa

1 建立AIDL文件    code

建立文件/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl    component

package com.xxx.agent;

interface IExperienceAgentService {
    void setTimeZone(String timeZone);
}

2 建立文件 /packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java (名字跟AIDL文件名沒有直接關係,能夠不一樣)    xml

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口實現
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

好服務端代碼基本上就寫完了,而後編譯,須要修改Android.mk文件    

添加     

LOCAL_SRC_FILES += \    

         src/com/xxx/agent/IExperienceAgentService.aidl

還須要在AndroidManifest.xml 裏面註冊建立的服務

添加    

 <service android:name="com.xxx.agent.ExperienceAgentService" >
     <intent-filter>
         <action android:name="com.xxx.agent.IExperienceAgentService" />  // action name 能夠自定義
     </intent-filter>
 </service>

再來看看客戶端該作什麼,首先確定須要啓動綁定服務,而後再調用服務。

客戶端包名 com.xxx.client

1 建立AIDL文件      

拷貝服務端建立的AIDL文件到客戶端目錄,路徑 com/xxx/agent/IExperienceAgentService.aidl,注意包路徑必須同樣,文件內容也必須同樣。      

2 綁定服務      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;

public class Client extends Activity {
    private IExperienceAgentServicemService = null;
    private ServiceConnection mConnection = new ServiceConnection() {
         // 鏈接服務端成功
         public void onServiceConnected(ComponentName className, IBinder service) {
             IExperienceAgentServicemService  = IExperienceAgentService.Stub.asInterface(service);
         }
         //服務端鏈接斷開
         public void onServiceDisconnected(ComponentName className) {
             IExperienceAgentServicemService  = null;
         }
    }
    @Override
    protected void onStart() {
        super.onStart();
        // 綁定服務,Intent 選擇服務端AndroidManifest註冊的action
        bindService(new Intent(」com.xxx.agent.IExperienceAgentService「, mConnection, Context.BIND_AUTO_CREATE);
    }
     @Override
    protected void onStop() {
        super.onStop();
        unbindService(mConnection);
    }
    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 調用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone("shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
}

至此,客戶端代碼也就編寫完成了


下面在來看看服務端調用客戶端提供的接口是怎麼工做的呢 

服務端須要修改的以下 

1 建立AIDL文件      

建立文件/packages/apps/Settings/src/com/xxx/agent/ICallback.aidl      

package com.xxx.agent;

interface ICallback{
    void updateTimeZone(String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl      

package com.xxx.agent;

import com.xxx.agent.ICallback;

interface IExperienceAgentService {
    void setTimeZone(ICallback cb, String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java      

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口實現
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(ICallback cb, String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
            cb.updateTimeZone(timeZone);
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

客戶端須要修改的以下      

1 拷貝服務端建立的ICallback.aidl文件到客戶端目錄,路徑 com/xxx/agent/ICallback.aidl      

2 綁定服務      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;
import com/xxx/agent/ICallback;

public class Client extends Activity {
    public class Callback extends ICallback.Stub
        @Override
        public void updateTimeZone(String timeZone) throwsRemoteException {
            Message msg = new Message();
            msg.obj = timeZone;
            mHandler.sendMessage(msg);
       }
    }

    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 調用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone(new Callback(), "shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
    
    private Handler mHandler = new Handler() {
        @Override 
        public void handleMessage(Message msg) {
             // 進行界面更新
        }
    }
}

至此AIDL服務端回調接口也已經完了。      

Google官方介紹連接:http://developer.android.com/guide/components/aidl.html 

相關文章
相關標籤/搜索