我的目标是创建一个隐含意图并使用 Intent.createChooser()方法,用于选择用于查看网页的应用程序 我被告知我需要创建一个选择器意图,用于选择要执行的活动。
我的第一个问题是为什么我需要2个意图呢?为什么我不能只使用baseIntent并将其放在createChooser()方法中?
我的第二个问题是为什么我的应用程序没有显示我可以选择打开我的URL的应用程序的菜单?
有人也可以检查我的意图过滤器,看看我是否全部使用过滤器。
MainActivity.java
static private final String URL = "http://www.google.com";
static private final String TAG = "Lab-Intents";
// For use with app chooser
static private final String CHOOSER_TEXT = "Load " + URL + " with:";
private void startImplicitActivation() {
Log.i(TAG, "Entered startImplicitActivation()");
Uri webpage = Uri.parse(URL);
Intent baseIntent = new Intent(Intent.ACTION_VIEW,webpage);
Intent chooserIntent = null;
startActivity(Intent.createChooser(baseIntent,CHOOSER_TEXT));
}
的AndroidManifest.xml
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="string"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
答案 0 :(得分:3)
我被告知需要创建一个选择器意图,用于选择要执行的活动。
不一定。
我的第一个问题是为什么我需要2个意图?
你没有。
为什么我不能只使用baseIntent并将其放在createChooser()方法中?
你当然可以做到这一点。 createChooser()
主要是强制一个选择器。
假设用户的Android设备上安装了Chrome和Firefox,并且您使用ACTION_VIEW
尝试在浏览器中显示网页。
如果您直接使用ACTION_VIEW
Intent
,并且用户已选择其中一个浏览器作为默认浏览器(来自之前的某些ACTION_VIEW
请求),则{{1}将被路由到默认浏览器。如果用户未选择默认浏览器,则会向用户显示选择器,因此用户可以选择要使用的两个Web浏览器中的哪一个。该选择器将为用户提供一种方式,使他们可以选择默认浏览器以用于将来的请求。
另一方面,如果您使用Intent
打包createChooser()
ACTION_VIEW
,则Intent
来电将始终显示选择器,即使用户已有选择了默认的Web浏览器。并且,此选择器将没有用户设置默认值的选项。
因此,通常情况下,您不使用startActivity()
,除非您认为存在重大风险,即用户的默认值不适合此情况。您通常会看到createChooser()
与createChooser()
一起使用,因为这是非常通用请求,其中默认值可能不是适当的操作过程。
我的第二个问题是为什么我的应用程序没有显示我可以选择打开我的URL的应用程序的菜单?
如果,当您使用ACTION_SEND
时,用户将直接转到某个活动,这是因为该活动是createChooser()
的唯一匹配。因此,例如,如果用户只安装了一个Web浏览器,并且您使用Intent
来显示URL,则系统不会仅为一个Web浏览器显示选择器,而是仅提供路由请求一个浏览器。