ContentProvider 的 getType(Uri uri)

在manifest文件中activity会有这样的属性

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.dir/person" />
    <data android:mimeType="vnd.android.cursor.dir/contact" />
</intent-filter>

ContentProvider 的 getType(Uri uri) 方法,返回的就是其中对应的mimetype值,匹配manifest的话,才能启动activity。

这个方法什么时候调用呢?

startActivity(intent)
Instrumentation.execStartActivity()
Intent.resolveTypeIfNeeded()

Intent.java

    public String resolveTypeIfNeeded(ContentResolver resolver) {
        if (mComponent != null) {
            return mType;
        }
        return resolveType(resolver);
    }

    public String resolveType(ContentResolver resolver) {
        if (mType != null) {
            return mType;
        }
        if (mData != null) {
            if ("content".equals(mData.getScheme())) {
                return resolver.getType(mData);
            }
        }
        return null;
    }
如果

    1、startActivity(intent)的intent 时隐式的(即没有直接设置类名)

    2、并且没有设置type

    3、并且设置了uri(如调用了setData(uri))

那么就会调用到

ContentResolver.getType(mData)
也就调用到了 ContentProvider 的 getType(Uri uri)。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ContentProvider 是 Android 平台上的一个组件,它可以让应用程序之间共享数据。使用 ContentProvider 可以方便地实现数据的共享和保护。下面是 ContentProvider 的使用步骤: 1. 创建 ContentProvider 子类。 2. 在 ContentProvider 子类中实现 onCreate()、query()、insert()、update() 和 delete() 方法,这些方法是 ContentProvider 必须实现的方法。 3. 在 AndroidManifest.xml 文件中注册 ContentProvider。 4. 在其他应用程序中通过 ContentResolver 类来访问 ContentProvider 中的数据。 以下是一个基本的 ContentProvider 示例代码: ``` public class MyContentProvider extends ContentProvider { // 定义 ContentProvider 的 MIME 类型 private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.provider.myprovider"; // ContentProvider 的数据源 private SQLiteDatabase mDatabase; // ContentProviderURI private static final Uri CONTENT_URI = Uri.parse("content://com.example.myprovider"); @Override public boolean onCreate() { // 初始化 ContentProvider 的数据源 mDatabase = new MyDatabaseHelper(getContext()).getWritableDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询数据 Cursor cursor = mDatabase.query("mytable", projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Override public Uri insert(Uri uri, ContentValues values) { // 插入数据 long rowId = mDatabase.insert("mytable", null, values); Uri insertedUri = ContentUris.withAppendedId(CONTENT_URI, rowId); getContext().getContentResolver().notifyChange(insertedUri, null); return insertedUri; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 更新数据 int count = mDatabase.update("mytable", values, selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除数据 int count = mDatabase.delete("mytable", selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { return CONTENT_TYPE; } } ``` 在 AndroidManifest.xml 文件中注册 ContentProvider: ``` <provider android:name=".MyContentProvider" android:authorities="com.example.myprovider" android:exported="true" /> ``` 在其他应用程序中访问 ContentProvider 中的数据,可以使用 ContentResolver 类的 query()、insert()、update() 和 delete() 方法。例如: ``` Uri uri = Uri.parse("content://com.example.myprovider/mytable"); ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); ``` 以上是 ContentProvider 的基本使用方法,通过 ContentProvider 可以实现应用程序之间的数据共享和保护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值