`

对ContentProvider中getType(Uri uri)和android.intent.category.DEFAULT的理解

 
阅读更多

 学习了ContentProvider,想做个通讯录,结果在Intent和getType(Uri uri)上卡住了,经过查找资料发现了问题的所在。在这里解释下getType(Uri uri)何时被调用,和android.intent.category.DEFAULT 的理解。

     我们需要什么时候加android.intent.category.DEFAULT呢?

1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。

     Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码: 
             Intent intent= new Intent(this, B.class)

     Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

2、intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。

理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。

例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。

我们定义的activity如果接受implicit intent的话,intent filer就一定要加上android.intent.category.DEFAULT这个category。

      我的问题就是出现在这里。忘记在intent-filter中加上了<category android:name="android.intent.category.DEFAULT" />了这个。

 

      getType(uri uri)这个方法何时被调用呢?

      当我们在程序中需要启动例外的activity时,很多时候我们是使用的隱式調用,即我们不直接指定要跳转的Activity,而是为Intent提供一些相关的参数,让其自动去和AndroidManifest.xml中已有的Activity去匹配,而IntentFilter(Intent 过滤器)在xml中有三個主要的参数:action,categary,data。

我们通过Intent的构造函数或者Intent提供的方法可以指定这个三个参数,如方法有:

            intent.setAction(action);
            intent.setData(data);
            intent.addCategory(category);

等,比如在记事本程序中有:

         <intent-filter android:label="@string/resolve_edit">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="com.android.notepad.action.EDIT_NOTE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>

我们很容易看出action和category是很容易匹配的,而我们传的Uri的数据怎么匹配呢,这是系统会去调用你定义的ContentProvider中的getType,取得相关的返回值來和上面的data串进行匹配,当然getType的返回结果你是需要自己去定义的。

但在程序中你也可以自己知道data的类型,就直接匹配了:intent.setType(type);

分享到:
评论

相关推荐

    ContentProvider

    &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess=...

    android 用ContentProvider操作文件

    2. 创建ContentProvider:要创建一个ContentProvider,你需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`query()`, `insert()`, `update()`, `delete()` 和 `getType()`。 3. 注册...

    Android、教程<经典> 8 Intent组件与ContentProvider

    在Android应用开发中,Intent和ContentProvider是两个至关重要的组件,它们构成了Android系统中的核心交互机制。本教程将深入探讨这两个概念以及它们在实际开发中的应用。 **Intent组件** Intent在Android中扮演着...

    android_contentprovider_system.rar

    本资源“android_contentprovider_system.rar”提供了一个关于ContentProvider的详细讲解和示例代码,旨在帮助开发者深入理解这一核心组件。 1. **ContentProvider基础** ContentProvider是Android系统中用于存储...

    android-2.高焕堂讲解 ContentProvider范例

    ContentProvider是Android系统中的四大核心组件之一,它扮演着数据共享的角色。通过ContentProvider,不同应用程序之间可以安全地访问和操作彼此的数据,而无需直接暴露底层实现,如SQLite数据库。在AndroidManifest...

    自定义ContentProvider

    - 自定义ContentProvider需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`onCreate()`、`query()`、`insert()`、`update()`、`delete()`和`getType()`。 2. **创建ContentProvider** - ...

    android contentprovider的使用

    在Android开发中,ContentProvider是Android四大组件之一,它的主要职责是实现应用程序间的数据共享。ContentProvider通过统一的接口让其他应用能够访问和修改特定的数据集,这些数据可能存储在SQLite数据库、文件...

    Android开发WebView获取SD卡图片并显示

    ContentProvider是Android系统中用于数据共享的机制,我们可以创建一个自定义的ContentProvider来处理SD卡上的图片,并返回一个Uri给WebView。以下是一些关键步骤: 1. 创建ContentProvider: - 定义一个继承自`...

    整理出来的一些Android基础知识

    `android.intent.action.MAIN`和`android.intent.category.LAUNCHER`的组合通常用于标记应用的主入口。 #### 获取屏幕尺寸 在Android开发中,获取屏幕尺寸是一个常见需求,可以通过以下代码实现: ```java ...

    ANDROID中的CONTACT MANAGER系统,带源代码.zip

    你需要创建一个继承自`android.content.ContentProvider`的类,重写它的`query`, `insert`, `update`, `delete` 和 `getType` 方法,以处理对联系人数据的各种操作。 2. **SQLite数据库**:联系人信息存储在SQLite...

    第5章--Android的内容提供者和意图.pptx

    本章节主要介绍了Android中的内容提供者(Content Provider)和意图(Intent)。内容提供者是一个允许不同应用程序之间共享数据的机制,而意图则是Android系统中的一种 Nachrichten mechanism,可以激活其他应用程序...

    Android安卓经典设计例程源代码-MediaProviderSample.rar

    在Android开发中,MediaProvider是Android系统提供的一种用于管理和共享媒体数据(如音频、视频、图片等)的服务。这个"Android安卓经典设计例程源代码-MediaProviderSample"压缩包包含了一个实例,它展示了如何使用...

    Android内容提供者(Content provider)

    2. **创建Provider类**:继承自ContentProvider,并实现其必要的方法,如query(), insert(), update(), delete() 和getType()。这些方法分别对应对数据的查询、插入、更新、删除和获取数据类型的操作。 3. **注册...

    Android基础学习笔记

    Android基础学习笔记主要涵盖了一系列关于Android开发的基本概念和关键组件,以下是这些知识点的详细解析: ...通过实践和不断学习,可以逐步深化对Android平台的理解,并开发出功能丰富的应用程序。

    应用源码之30.Content_Providers(2).zip

    通过分析和学习这些源码,可以加深对Content Provider工作原理的理解,提升在实际项目中使用Content Provider的能力。同时,了解如何通过Content Provider合理地管理数据,提高数据安全性和应用间的数据交互效率。

    android provider

    总之,Android Provider是Android平台中实现数据共享的关键机制,理解和熟练运用Content Provider,可以提升应用的互操作性和功能丰富度。在开发过程中,应充分利用其特性,同时注意权限管理和性能优化,以创建健壮...

    content provider.doc

    开发者需要在`onCreate()`方法中初始化数据库,然后重写`query()`, `insert()`, `update()`, `delete()`和`getType()`方法来处理数据操作请求。 8. **Intent中的URI数据**: URI也常用于Intent的数据字段中,用于...

    Android基础-09

    总的来说,"Android基础-09"这个主题深入讲解了内容提供者这一核心概念,对于理解和实践Android应用的数据共享至关重要。开发者应熟练掌握内容提供者的用法,以便在需要跨应用数据交换的场景下得心应手。

    应用源码之29.Content_Providers(1).zip

    `getType()`方法返回对应Uri的MIME类型,这对于Intent的匹配和数据处理非常重要。 5. **数据存储**:Content Provider可以与多种数据存储机制集成,如SQLite数据库、文件系统或网络服务。Android提供了...

Global site tag (gtag.js) - Google Analytics