我正在使用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,它将始终被查看。可能吗?或者还有其他可能的解决方案吗?
谢谢
答案 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.com
到com.example.myapp.DownloadActivity
的映射最新。
因此,Android只是针对“http://foo.com启动包含com.example.myapp
的应用”,然后让应用内部将其发送到与您的应用匹配的第一个 Intent过滤器清单。
正如已经说过的,我不是百分百肯定,但对我来说这似乎是合理的......