相关文章:
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 是这么规定的。- 必须以vnd开头
- 如果是多条记录,后面接android.cursor.dir/,如果是单条记录,后面接android.cursor.item/
- 最后 加上"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又是怎样一个流程呢?
- 系统通过URI中的Authority来匹配ContentProvider,从而找到我们的BookProvider。
- 找到BookProvider,所以这时候会调用getType(uri)传入通过setData的URI返回URI的MIME类型:
- 根据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