7

我的一个应用中有一个 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>

(Activity 仅供内部使用;我的应用程序的一部分允许用户从可以在某处发送文本的所有 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 一样,我得到一个安全异常。但是,为 Intent 请求活动会为您提供一个列表,其中包括您不允许开始的活动,这似乎很奇怪。

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

4

1 回答 1

10

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

这太合乎逻辑了:-)

有没有我可以用来说“不要向我显示私人活动”的标志

当然没有记录在案的。

或者过滤结果以摆脱我不允许开始的活动的简单方法?

给定 a ResolveInfoactivityInfo.exported boolean对于非导出活动, 应该是错误的。您可以遍历queryIntentActivities()结果并清除未导出的结果。

于 2012-07-10T11:00:19.003 回答