活动选择器中列出的活动exports = false

时间:2012-12-15 13:42:39

标签: android android-intent android-activity android-manifest android-implicit-intent

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

使用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的intent过滤器,但我的问题是:为什么在doc读取时会显示来自其他应用程序的活动

  

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

1 个答案:

答案 0 :(得分:5)

  

我不明白为什么付费应用中的活动会显示,因为它已导出=“false”

因为您有匹配的<intent-filter>。由于您不需要<intent-filter>用于非导出活动,因此只需将其删除并在开始此活动时使用显式Intent

  

为什么当文档读取时,其他应用程序的活动会显示...

I had the same question并且被告知这是预期的行为,而且我们的应用程序中存在一个无用的<intent-filter>错误。引用Dianne Hackborn:

  

我通常认为这是应用程序中的一个错误 - 如果你有一个活动,你不允许其他应用程序启动,为什么你发布一个他们将匹配尝试启动的意图过滤器?活动的安全性(无论是未导出还是需要许可)不是意图匹配的一部分。 ...这种情况(发布一个与其他应用程序将使用的意图相匹配的活动,但后来将其限制为其他应用程序无法启动的活动)如果不是彻底破坏则无用。