非导出活动在活动选择器中列出

5

我有两个类似的应用程序(一个免费,一个付费)。

一个活动被定义为 exported="false"

    <activity
        android:name=".MyActivity"
        android:exported="false"
        android:noHistory="true" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android.cursor.item/vnd.mine" />
        </intent-filter>
    </activity>

当我从免费应用程序使用适当的隐式意图调用startActivity时,会出现活动选择器。
我不明白为什么来自付费应用的活动会出现,因为它被设置为exported="false" 我想我可以添加一个基于URL的意图过滤器,但我的问题是:当文档中写到

无论活动是否可以由其他应用程序的组件启动

为什么另一个应用程序的活动会出现?
1个回答

7
因为您有一个匹配的 <intent-filter>。由于非导出活动不需要 <intent-filter>,因此只需删除它并在启动此活动时使用显式 Intent 即可。
为什么当文档中写着...另一个应用程序的活动会出现呢?我也有同样的问题,并被告知这是预期行为,而我们的应用程序因拥有无用的 <intent-filter> 而存在漏洞。Dianne Hackborn 的话:我通常认为这是应用程序中的一个错误 - 如果您有一个您不允许其他应用程序启动的活动,为什么要发布一个意图过滤器,以便它们匹配尝试启动?活动的安全性(无论它是否未导出或需要权限)不是意图匹配的一部分。...如果不是完全损坏,那么这种情况(发布与其他应用程序将使用的意图相匹配的活动,但然后限制其不能被其他应用程序启动)是没有用的。

再次感谢您提供了出色的答案,尽管我对此并不是很满意。我可以回复Dianne Hackborn:我希望库项目中的代码是通用的,它定义了一个AbstractActivity;免费应用程序定义了一个名为.MyActivity的活动,付费应用程序定义了一个名为.MyProActivty的活动,两者具有相同的意图过滤器。当继承无法完成时,我通常会认为框架存在错误。 - rds
解决方法:在抽象类中添加一个返回类或显式意图的方法。(在我的特定情况下,我真的不想这样做) - rds
@rds:“我希望库项目中的代码是通用的” - 这并不是<intent-filter>的真正作用。它可以与导出活动一起使用,但这不是它最初的目的。它应该是向操作系统和第三方广告您愿意让他们使用的功能。 - CommonsWare
谢谢,我明白了。在问题中,我提到使用数据来优化过滤器,但类别的工作方式类似(在我的情况下,我已经将类别用于其他用途)。 - rds
请注意,您可以在Intent<intent-filter>中拥有多个类别。如果我没记错的话,过滤器必须匹配Intent中的每个类别。 - CommonsWare
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接