Android

Android便捷的跨进程通信实现方式

2019-02-12  本文已影响0人  眼角的伤痕

跨进程通信在Android中是非常重要的一部分内容,一般跨进程通信有:AIDL、Message、ContentProvider、Socket这些方式,在开发中用的比较多的就是Aidl和Message,Message底层其实也是Aidl实现的。讨论Android跨进程通信离不开一个关键的东西---Binder,Binder是一个很复杂的东西,可以从底层讲到上层,从系统层讲到应用层,由于本人能力有限,我自己也讲不清Binder,这里分享一个讲解Binder的系列文章,有兴趣的可以去看一下Binder讲解,平常使用的Aidl本质上也是基于Binder实现的,一般跨进程通信实现方式为:

  1. 定义Aidl文件--编写Aidl文件
  2. 实现接口--Service实现
  3. 暴露接口--通过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即可实现。传送门

上一篇 下一篇

猜你喜欢

热点阅读