queryIntentActivities()包括结果中的私有活动

时间:2012-06-21 14:33:10

标签: android android-intent android-activity

我的某个应用中有一个活动,它有一个Intent过滤器,但仍然标记为私有,即android:exported=false

    <activity android:exported="false" android:name=".facebook.PostToFacebookActivity" android:icon="@drawable/facebook_icon" android:label="@string/facebook_built_in">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>

(活动仅用于内部使用;我的应用程序的一部分,允许用户从任何可以某处发送文本活动列表中进行选择,这使得我的一对夫妇的应用程序内部的选项添加到整体名单容易。)

但是,当我从不同的应用中使用queryIntentActivites()时,我的“私有”活动仍然会被返回:

// Returned list includes the above activity, even though it's declared private.
List<ResolveInfo> infoList = pm.queryIntentActivities(
        myIntent,
        PackageManager.MATCH_DEFAULT_ONLY | 
        PackageManager.GET_INTENT_FILTERS
);

基本的安全性似乎工作正常,就好像我尝试从其他应用程序启动Activity,我得到一个安全异常。但似乎奇怪的是,要求一个意图的活动会给你一个列表,其中包括你不允许开始的活动。

我原以为如果某个活动设置为不导出,它甚至不会出现在queryIntentActivities()结果中。无论如何,这就是我想要的行为。是否有一个标志我可以用来说“不要向我展示私人活动”,或者是一种简单的方法来过滤结果以摆脱我不允许开始的活动?

1 个答案:

答案 0 :(得分:7)

  

我原以为如果将Activity设置为不导出,它甚至不会出现在queryIntentActivities()结果中。

这是方式过于合乎逻辑。 : - )

  

是否有一面旗帜我可以用来说“不要告诉我私人活动”

当然没有任何记录。

  

还是一种简单的方法来过滤结果以摆脱我不允许开始的活动?

如果有ResolveInfo,则activityInfo.exported boolean对于未导出的活动应为false。您可以遍历queryIntentActivities()结果并清除未导出的结果。