【我的Android进阶之旅】数据源的getType和MIME类型

相关文章:
1、《【我的Android进阶之旅】自定义ContentProvider》

一、概述

在上篇中,我们讲了如何通过派生ContentProvider自定义我们的内容提供者,我们重写了数据库操作的insert()、query()、update()、delete()函数,但对于getType()这个方法并没有进行讲解,我们先看下getType()的官方说明

*   <li>{@link #getType} which returns the MIME type of data in the content provider</li>
总体来说,就是传进去一个内容提供者URI,返回一个表示MIME类型的对象 (咱们这章的代码都是基于前一篇文章实现的)

二、概述

1、什么是MIME类型

MIME:全称Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务。它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 看完之后,只有一个感觉……依然不懂!简单来讲,在安卓中,MIME类型就是用来标识当前的Activity所能打开的文件类型!

2、MIME类型在安卓中的应用

那现在看看在android中,MIME类型是用来干什么的呢? 首先,MIME类型主要是Activity的Intent-filter的data域;比如下面这个Activity:

<activity android:name=".BookActivity">
    <intent-filter>
        <action android:name="com.wzy.action"/>
        <data android:mimeType="vnd.android.cursor.dir/vnd.com.wzy.provider.books"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

这里指定了data域的MimeType值是"vnd.android.cursor.dir/vnd.com.wzy.provider.books",即在利用隐式Intent匹配时,只有指定MimeType是"vnd.android.cursor.dir/vnd.com.wzy.provider.books"时,才能启用这个Activity,也就是说,这个Activity只能打开这种类型的文件!!!!这才是MIME类型匹配的重点;
所以MIME类型在Activity中是用来指定,当前的Activity所支持打开的文件类型!

三、关于 getType()方法

1、概述

关于MIME类型,android 是这么规定的。
  1. 必须以vnd开头
  2. 如果是多条记录,后面接android.cursor.dir/,如果是单条记录,后面接android.cursor.item/
  3. 最后 加上"vnd.<authority>.<path>"

所以,对于"content://com.wzy.provider/books"这个uri,它对应的类型就可以写成
“vnd.android.cursor.dir/vnd.com.wzy.provider.books”;
对于"content://com.wzy.provider/books/#"这个uri,它对应的类型就可以写成
“vnd.android.cursor.item/vnd.com.wzy.provider.books”,

@Nullable
@Override
public String getType(@NonNull Uri uri) {
    Log.e("wzytest","getType uri:"+uri);
    switch (uriMatcher.match(uri)) {

        case BOOKS:
            return "vnd.android.cursor.dir/vnd.com.wzy.provider.books";
        case BOOK_ID:
            return "vnd.android.cursor.item/vnd.com.wzy.provider.books";
        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
}

2、getType在隐式启动Activity的时候的作用

我们看下下面这种启动activity的方式
Intent intent = new Intent();
intent.setAction("com.wzy.provider");
Uri mCurrentURI = Uri.parse("content://com.wzy.provider"+ "/books");
intent.setData(mCurrentURI);
startActivity(intent);

在上面的代码中,我们设置了action 和 content uri;
这里利用Content URI来启用隐式启用Activity又是怎样一个流程呢?

  1. 系统通过URI中的Authority来匹配ContentProvider,从而找到我们的BookProvider。
  2. 找到BookProvider,所以这时候会调用getType(uri)传入通过setData的URI返回URI的MIME类型:
  3. 根据Action和MIME类型来打开相应的活动

3、新建Activity用来通过URI启动

<activity android:name=".BookActivity">
    <intent-filter>
        <action android:name="com.wzy.action"/>
        <data android:mimeType="vnd.android.cursor.dir/vnd.com.wzy.provider.books"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

4、验证结论

首先我们在BookProvider 的getType() 方法里面加入一些打印日志
@Nullable
@Override
public String getType(@NonNull Uri uri) {
    Log.d(TAG,"Run in method getType() ,uri:"+uri);
    switch (uriMatcher.match(uri)) {

        case BOOKS:
            return "vnd.android.cursor.dir/vnd.com.wzy.provider.books";
        case BOOK_ID:
            return "vnd.android.cursor.item/vnd.com.wzy.provider.books";
        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
}

然后将startActivity的方法绑定到一个按钮上,通过uri来启动另一个Activity

在这里插入图片描述

验证结果:点击正常启动Activity!

在这里插入图片描述

查看日志:

在这里插入图片描述

总结

ContentProvider 的getType 方法会在通过uri获取MIME 类型的时候调用,隐式启动活动就是其中一种表现形式
 

作者:王宗耀 欢迎转载,与人分享是进步的源泉!
  转载请保留原文地址:http://blog.csdn.net/wzy901213

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值