安卓中不同APP之间的消息通信

昨天在腾讯实习生招聘初试面试时面试官问道我关于两个APP之间相互通信的方式,当时自己回道到了contentProvider与BroadcastReceiver。但他接着问还有没有其它的方式,我跟他说可以使用AIDL,但是当时没说清楚,所以最后我说目前只知道这两种方式,然后他说可以使用文件的方式或云端存储的方式共享。面试回来后自己上网查了一下相关知识,根据自己的理解将安卓中不同APP之间消息通信总结如下:


首先要明白消息通信一般包括两种,一种是简单的数据访问,如ContentProvider,使用文件或云端方式共享,一种是消息的传递(传递的任然是数据,但不再是单纯的数据访问,而是组件之间的相互通信),如AIDL,BroadcastReceiver,Messenger。


一使用ContentProvider

ContentProvider(内容提供者)是Android中的四大组件之一,内容提供者将一些特定的应用程序数据供给其它应用程序使用,它主要作用是用来在多个APP之间共享数据,如腾讯QQ中的QQ电话功能需要获取用户手机上的联系人的手机号码,还算不上标准的多个APP之间的消息通信(因为共享数据只是消息通信中很小的一部分)。共享的数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格形式,因此该类提供给我们的方法类似于sqlite数据库中的增删改查的操作。

要使用ContentProvider我们需要先来了解一个概念URI。

1 URI(统一资源标识符(Uniform Resource Identifier))用来唯一的标识一个资源。在上述我说过ContentProvider是用来在多个APP之间共享数据的,那么首先我们得找到这个数据,这个资源(数据属于资源的一种)是采用URI来标识的。它包括三个部分:scheme authority and path,其中在安卓中共ContentProvider访问的scheme固定值为:content://(就像Http协议固定值为http://),authority包括host和port。

scheme:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"

authority:URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称

path:路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;"content://com.bing.provider.myprovider/tablename"

如果URI中包含表示需要获取的记录的ID(数据以表的形式表示),则就返回该id对应的数据,如果没有ID,就表示返回全部

要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uri uri = Uri.parse("content://com.demo.provider.personprovider/person");

2ContentProvider共享数据

我们先来看一下ContentProvider(ContentProvider为一个抽象类)的重要方法:

  public abstract boolean onCreate();

 public abstract Cursor query(Uri uri, String[] projection,
            String selection, String[] selectionArgs, String sortOrder);

 public Cursor query(Uri uri, String[] projection,
            String selection, String[] selectionArgs, String sortOrder,
            CancellationSignal cancellationSignal) {
        return query(uri, projection, selection, selectionArgs, sortOrder);
    }

  public abstract String getType(Uri uri);
  public abstract Uri insert(Uri uri, ContentValues values);
  public abstract int delete(Uri uri, String selection, String[] selectionArgs);
  public abstract int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs);
可以看到ContentProvider中的增删改查这些重要的方法都是抽象的,因此当我们继承自该类时需要重写其抽象方法。

3ContentResolver来操作数据

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,需要使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法(即该方法位于Context类中)。

ContentResolver cr = getContentResolver();

ContentProvider负责组织应用程序的数据,向其他应用程序提供数据,ContentResolver则负责获取ContentProvider提供的数据。因此可以知道ContentResolver中也因该存在增删改

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值