Android的AIDL是什麼呢,AIDL就是Android Interface Defination Language,其實說白了,它就是Android定義好的,處理序間通訊的一種機制而已,
有點像那個調用Service裡面的方法。
好,我們下面就通過代碼來說明
首先,我們先寫一個介面
com.xiaobin.service.IService
package com.xiaobin.service;public interface IService{public void sayService();}
很簡單,就一個方法而已,和我們之前講的調用Service裡面的方法一樣,
現在就說一下不同的地方啦,我們現在就要把上面那個介面裡的方法的修飾符public去掉,然後再把尾碼名改為.aidl
然後呢,我們就會發現Eclipse會幫我們產生一個類的了
接下來,我們再寫一個Service類
com.xiaobin.service.remote.RemoteSrevice
package com.xiaobin.service.remote;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import com.xiaobin.service.remote.IService;public class RemoteService extends Service{@Overridepublic IBinder onBind(Intent intent){//返回我們自己的Binderreturn new MyBinder();}@Overridepublic void onCreate(){System.out.println("service onCreate");super.onCreate();}//服務裡面的方法public void sayService(){System.out.println("我是另一個進程裡面的方法喔");}//繼承由AIDL產生的抽象類別class MyBinder extends IService.Stub{@Overridepublic void invokeServiceMethod() throws RemoteException{//調用服務裡面的方法sayService();}}}
寫完這個之後,我們就要在AndroidMainfest裡面註冊它了
<service android:name="com.xiaobin.service.remote.RemoteSrevice"> <intent-filter> <action android:name="com.xiaobin.remoteservice"/> </intent-filter> </service>
大家可以看到,我們指定了一個action,這個是為了呆會調用時所指定的。
好啦,到現在為止,我們的遠程服務就已經寫好的了
接下來,我們建立一個項目,注意,是建立一個項目,然後寫一個調用剛剛我們寫的這個服務的類
但在寫之前,我們要把我們剛剛寫好的aidl檔案也拷貝到這個項目裡面
那麼,接下來,我們就寫一下我們的調用邏輯了
com.xiaobin.aidlservice.MainActivity
package com.xiaobin.aidlservice;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.widget.Toast;import com.xiaobin.service.remote.IService;public class MainActivity extends Activity{private IService iService = null;private MyServiceConnection conn;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);conn = new MyServiceConnection();Intent intent = new Intent();// 剛剛在註冊那個服務時指定的intent.setAction("com.xiaobin.remoteservice");this.bindService(intent, conn, BIND_AUTO_CREATE);}public void click(View v){try{if(iService != null){//調用介面裡面的方法iService.invokeServiceMethod();}else{Toast.makeText(this, "調用遠程服務出錯", Toast.LENGTH_SHORT).show();}}catch (RemoteException e){e.printStackTrace();}}@Overrideprotected void onDestroy(){if(conn != null){this.unbindService(conn);}super.onDestroy();}class MyServiceConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service){//拿到我們當時自己寫的Binder對象iService = IService.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name){}}}
好啦,到現在為止,我們的代碼就寫好的啦,現在我們就可以測試一下的啦,年一下System.out這個標籤的輸出就可以啦
講到這裡,我們就要講一下AIDL有什麼應用啦
下面我們就講一個掛斷電話的例子,我們知道,Android的api裡面是沒有掛斷電話的操作的
那如果我們的應用就有這樣一個需求呢,那怎麼辦
其實也很容易,就是通過aidl來掛斷電話,那麼我們現在來寫一下
首先,我們先把兩個aidl檔案複製到src目錄下面
你肯定會問,這些aidl檔案是在那裡找到的,那麼我可以告訴你,這些是Android的源碼裡面找到的,就是在base這個下面的
大家可以下載下來看看,如果有不會的,請看點擊這裡
既然把aidl檔案拷貝過去之後,我們就可以寫代碼啦
com.xiaobin.endcall.MainActivity
package com.xiaobin.endcall;import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;import android.app.Activity;import android.os.Bundle;import android.os.IBinder;import android.view.View;public class MainActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);}public void click(View v){endCall();}//掛斷電話private void endCall(){try{//通過反射拿到android.os.ServiceManager裡面的getService這個方法的對象Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);//通過反射調用這個getService方法,然後拿到IBinder對象,然後就可以進行aidl啦IBinder iBinder = (IBinder) method.invoke(null, new Object[] {TELEPHONY_SERVICE});ITelephony telephony = ITelephony.Stub.asInterface(iBinder);telephony.endCall();}catch (Exception e){e.printStackTrace();}}}
因為那個服務沒有公開的,所以我們就要用到反射來調用這個服務,來拿到Binder對象
還有重要的一點喔,要加上相應的許可權,不然掛不斷的喔
<uses-permission android:name="android.permission.CALL_PHONE"/>
好啦,到這裡,掛斷電話的操作就完成的啦,可以測試一下啦,然後我們手機衛士的這個項目的黑名單那裡也有掛斷電話的操作的喔
今天源碼下載