其作用是跨應用調用服務,也就是調用別人編寫的服務或是自己寫服務給別人調用
所以至少要2個程序來完成,一個是定義服務,一個是調用服務
AIDL的編寫流程:
服務端:
AIDLServiceDemo.java
1.src下面的包中建立file
編寫aidl文件,這個文件和寫Java接口基本一樣,唯一的區別是第一不支持自定義類型,第二不允許任何修飾符
package com.example.aidlservicedemo;
interface MyServiceInterface{
void sayHello();
}
保存後悔會在gen下生成一個相應的Java類--------MyServiceInterface。Java暫時不用管
2.接下來我們正常編寫Service類,實現onBind方法
在onBind方法中創建並返回gen包中自動生成的那個java類中的內部類Stub的實現類對象
最後別忘了註冊Service,另外通過意圖過濾器設定一個別名,以便其他程序訪問
以上操作是完成了服務提供方的代碼
同樣在stc/下的包中建立一個 Myservice.java
package com.example.aidlservicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new MyServiceInterface.Stub() {
@Override
public void sayHello() throws RemoteException {
Log.v("TAG", "你好,我是AIDL服務返回的數據,我來自com.example.aidlservicedemo");
}
};
}
}
3.註冊
<service android:name=".MyService">
<intent-filter>
<action android:name="myService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
接下來我們開始編寫服務使用者的功能
AIDLClientDemo.java
正常綁定服務,編寫ServiceConnection接口實現類
只不過實現類中onServiceConnected方法的參數IBinder service不能直接轉型
而是必須通過之前gen包中生成的Java類的Stub類中的靜態方法asInterface來使其IBinder類型轉換爲gen包中生成的那個Java類類型
1.在MainActivity.java中
佈局一個按鈕出發
package com.example.aidlclientdemo;
import com.example.aidlservicedemo.MyServiceInterface;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try{
MyServiceInterface myService=MyServiceInterface.Stub.asInterface(service);
myService.sayHello();
}catch(Exception e){
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("myService");
bindService(intent, conn, BIND_AUTO_CREATE);
}
});
}
}
2.將AIDLServiceDemo.java的gen下的包複製到src下,刪除其中的兩個Java類(BuildConfig.java和R.java)
代碼完成
先運行AIDLServiceDemo,保持在後臺,然後在運行,否則不會得調用遠程服務獲得數據