AIDL
AIDL (Android Interface Definition Language),Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
为什么使用AIDL
使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。 如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口。
定义AIDL接口的步骤
1、创建.aidl 文件(Android Studio)
// IMyAidlInterface.aidl
package com.owen.provider;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
String getValue();
}
2、实现接口并暴露给客户端
Android SDk工具基于.aidl文件使用java语言生成一个接口 这个接口有一个内部抽象类,叫做Stub,它是继承Binder并且实现你AIDL接口的 你必须继承这个Stub类并且实现这些方法,实现一个service并且覆盖onBind()方法返回你的Stub实现类。
public class UpdateService extends Service {
private String aidl = "aidl";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImp();
}
private class MyServiceImp extends IMyAidlInterface.Stub {
@Override
public String getValue() throws RemoteException {
return aidl;
}
}
}
实现步骤 :
1、aidl
interface IMyAidlInterface {
String getValue();
}
2、建立服务类
public class UpdateService extends Service {
private String aidl = "aidl";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImp();
}
private class MyServiceImp extends IMyAidlInterface.Stub {
@Override
public String getValue() throws RemoteException {
return aidl;
}
}
}
3、AndroidManifest中申明Service
<service android:name=".UpdateService">
<intent-filter>
<!-- 指定调用AIDL服务的ID -->
<action android:name="com.owen.provider.IMyAidlInterface" />
</intent-filter>
</service>
4、启动Service
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface iMyAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService(new Intent("com.owen.provider.IMyAidlInterface"), new Connection(), Context.BIND_AUTO_CREATE);
findViewById(R.id.aidl).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (iMyAidlInterface != null) {
Toast.makeText(MainActivity.this, iMyAidlInterface.getValue(), Toast.LENGTH_LONG).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private class Connection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}