Android便捷的跨进程通信实现方式
2019-02-12 本文已影响0人
眼角的伤痕
跨进程通信在Android中是非常重要的一部分内容,一般跨进程通信有:AIDL、Message、ContentProvider、Socket这些方式,在开发中用的比较多的就是Aidl和Message,Message底层其实也是Aidl实现的。讨论Android跨进程通信离不开一个关键的东西---Binder,Binder是一个很复杂的东西,可以从底层讲到上层,从系统层讲到应用层,由于本人能力有限,我自己也讲不清Binder,这里分享一个讲解Binder的系列文章,有兴趣的可以去看一下Binder讲解,平常使用的Aidl本质上也是基于Binder实现的,一般跨进程通信实现方式为:
- 定义Aidl文件--编写Aidl文件
- 实现接口--Service实现
- 暴露接口--通过BindService返回Binder
一般的跨进程通信就是基于以上方式实现,这种方式存在的缺点就是每次都需要定义一个Service,再通过BindService来进行进程间通信。最近翻看代码发现可以用ContentProvider.call()来实现便捷的跨进程通信。方法原型为:
public Bundle call(String method, String arg, Bundle extras)
method可以用来区分调用的逻辑,arg貌似没什么用,extras是一个Bundle类型用来存放数据。
用法如下:
@Override
public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
if (!TextUtils.isEmpty(method) && TextUtils.equals(method, "setData")) {
mBinderParcel.mProxy = extras.getBinder("binder");
} else if (!TextUtils.isEmpty(method) && TextUtils.equals(method, "getData")) {
Bundle bundle = new Bundle();
bundle.putBinder("binder", mBinderParcel.mProxy);
return bundle;
}
return null;
}
调用的时候如下:
getContentResolver().call(Uri.parse("content://com.example.mycontentprovider"), "setData", null, bundle);
Bundle bundle = getContentResolver().call(Uri.parse("content://com.example.mycontentprovider"), "getData", null, null);
在网上找到一片文章,它是通过定义两个ContentProvider来实现跨进程通信,觉得太麻烦了,本文Demo中通过配合Aidl即可实现。传送门