Android应用默认设置 - 两个处理活动,设置默认活动

时间:2016-02-04 14:24:26

标签: android android-activity android-manifest default

我正在使用2个选项执行自定义浏览器:查看或下载页面。清单文件看起来像这样:

<activity android:name=".ViewActivity" .... >
    <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <category android:name="android.intent.category.DEFAULT" />                
            <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>
<activity android:name=".DownloadActivity" .... >
    <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data android:scheme="http" />
                <data android:scheme="https" />
                <category android:name="android.intent.category.DEFAULT" />                
                <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

当我打开URL时,我可以选择要做什么。一切正常,直到我选择DownloadActivity并用ALWAYS确认 - &gt;它设置应用程序默认值(默认打开)。下次当我点击链接时,URL由ViewActivity处理(因为它首先在Manifest文件中声明 - 我试图在清单中交换活动)。

你能帮我解决一下如何设置默认的Activity(不是应用程序)来打开URL吗?当我将Download一直设置为总是下载时,如果我将View设置为ALWAYS,它将始终被查看。可能吗?或者还有其他可能的解决方案吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我不是百分百肯定,但我认为这是android存储“默认”(通过点击ALWAYS)并将url调度到意图过滤器的限制。

Android通过单击ALWAYS来存储应该打开哪个应用程序,而不是哪个Activity,因为可以重命名,删除等等。所以想象一下,因为android系统必须查找如何打开http://foo.com应用程序。您必须在内部查找表中查看“默认”(通过单击ALWAYS),然后确定包含com.example.myapp的应用程序应该是打开的。

现在想象一下,您应该存储具体的Activity com.example.myapp.DownloadActivity,而不仅仅是应用程序的包名。这很危险,因为DownloadActivity可能已被重命名,删除,甚至只是在将DownloadActivity设置为“默认”和已引入该更改的应用程序更新之后,可能已从DownloadActivity中删除了intent过滤器。

Android操作系统获得通知的唯一事情是安装或卸载应用程序的时间,但是如果已重命名或删除应用程序的活动等,则不会。

因此,Android无法保证它可以保持从http://foo.comcom.example.myapp.DownloadActivity的映射最新。

因此,Android只是针对“http://foo.com启动包含com.example.myapp的应用”,然后让应用内部将其发送到与您的应用匹配的第一个 Intent过滤器清单。

正如已经说过的,我不是百分百肯定,但对我来说这似乎是合理的......