意图解析 - 来自ContentProvider的数据的隐含意图

时间:2014-10-05 07:25:23

标签: android android-intent android-contentprovider

我患有意图解析机制。

我有内容提供商:

<provider
 android:authorities="com.company.app"
 android:name=".content.MyProvider"
 android:exported="false" />

我有一个活动:

<activity
        android:name=".activity.DetailedFlowActivity"
        android:parentActivityName=".activity.LauncherActivity">

    <intent-filter>
            <action android:name="com.company.app.EDIT_CATEGORY" />

            <action android:name="com.company.app.ANOTHER_EDIT_ACTION" />

            <data
                android:scheme="content"
                android:host="com.company.app"

                />


        </intent-filter>
   <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.LauncherActivity" />
</activity>

提供程序有两个特定路径(即SQLite数据库中的两个表),Activity本身知道如何查询这两个路径。所以我只使用权限和方案声明<data>,假设这足以解决意图。

问题是:每当我这样做时:

Intent intent = new Intent(DetailedFlowActivity.ACTION_EDIT_CATEGORY);
intent.setData(
       Uri.withAppendedPath(CategoryItemContract.CONTENT_URI,   
       String.valueOf(categoryId)));

startActivity(intent);

我希望Intent能够解析为DetailedFlowActivity,但它没有告诉我没有找到合适的Activity来处理这样的意图:where action = com.company.app.EDIT_CATEGORY和data =内容://com.company.app/categories/123

我当然可以转向使用显式意图,因为这些内容发生在我的应用程序中,但我宁愿用漂亮的RESTful方法来实现:)

帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

好的,现在我明白了。 Luksprog的评论迫使我再次阅读Intent resolution documentation,并对URI数据匹配部分给予更多关注。

首先,指定CATEGORY_DEFAULT,因为意图是隐式的。这是必要的,我错过了这件事。

第二,虽然它说:

  

包含URI但没有MIME类型的intent(既不显式也不显式)   只有在URI匹配时才传递测试   filter的URI格式和过滤器同样没有指定MIME   型

我发现,如果我的ContentProvider 需要指定MIME类型进行intent-filter。并通过操作将我的intent-filter拆分为两个过滤器:

<intent-filter>
    <action android:name="com.company.app.EDIT_CATEGORY" />
        <category android:name="android.intent.category.DEFAULT" />
            <data
                android:scheme="content"
                android:host="com.trustydroid.xpense"
                android:mimeType="vnd.android.cursor.item/vdn.categories"
                />

 </intent-filter>

..和其他人一样。

希望这有帮助。