【问题标题】:Android Intent createChooser()Android Intent createChooser()
【发布时间】:2015-11-08 22:24:58
【问题描述】:

我的目标是创建一个隐式 Intent 并使用 Intent.createChooser() 方法选择用于查看网页的应用程序 有人告诉我,我需要创建一个选择器意图,用于选择要执行的 Activity。

我的第一个问题是为什么我需要 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>

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    有人告诉我,我需要创建一个选择器意图,用于选择要执行的 Activity。

    不一定。

    我的第一个问题是为什么我需要 2 个意图?

    你没有。

    为什么我不能只使用 baseIntent 并将其放在 createChooser() 方法中?

    你当然可以做到。 createChooser() 所做的主要是 force 一个选择器。

    假设用户在其 Android 设备上同时安装了 Chrome 和 Firefox,并且您使用 ACTION_VIEW 尝试在浏览器中打开网页。

    如果您直接使用ACTION_VIEWIntent,并且如果用户选择其中一个浏览器作为默认浏览器(来自之前的一些ACTION_VIEW 请求),Intent 将被路由到默认浏览器.如果用户没有选择默认浏览器,则向用户呈现一个选择器,因此用户可以选择使用两个 Web 浏览器中的哪一个。该选择器将有一种方式让用户将他们的选择作为未来请求的默认浏览器。

    另一方面,如果您使用createChooser() 包装您的ACTION_VIEW Intent,您的startActivity() 调用将始终显示一个选择器,即使用户选择了默认Web 浏览器。而且,这个选择器将没有用户设置默认值的选项。

    因此,通常情况下,您不会使用createChooser(),除非您认为用户的默认设置存在很大风险,即在这种情况下用户的默认设置不是正确的选择。您通常会看到 createChooser()ACTION_SEND 一起使用,因为这是一个非常通用的请求,默认值可能不是适当的行动方案。

    我的第二个问题是为什么我的应用程序没有显示菜单,让我可以选择哪个应用程序打开我的 URL?

    如果当您使用createChooser() 时,用户会被直接带到一个活动,那是因为该活动是Intent 的唯一匹配项。因此,例如,如果用户只安装了一个 Web 浏览器,并且您使用 ACTION_VIEW 来显示一个 URL,那么系统不会只为一个 Web 浏览器提供选择器,而是只会将请求路由到那个浏览器。

    【讨论】:

    • 感谢您的解释!意图过滤器呢?你知道它们是否正确吗?我是否定义了正确的 元素?
    • @JasonWan:“你知道它们是否正确吗?” -- 好吧,string 不是 MIME 类型。主屏幕——寻找MAIN/LAUNCHER 活动的典型应用程序——不会在其Intent 结构上放置MIME 类型。因此,此活动不会由主屏幕启动器启动。目前尚不清楚您要在这里完成什么。如果您尝试让活动响应MAIN/LAUNCHER,并响应VIEW/BROWSABLE/MIME 类型,请使用两个单独的&lt;intent-filter&gt; 元素,每个结构一个。
    • 在AndroidManifest.xml文件中,将相应的Intent Filter添加到MyBrowserActivity,这样Android就会知道这个Activity可以查看网页了。为了表明 Activity 可以处理这种类型的 Intent,您需要在 Lab3b_MyBrowser 的 AndroidManifest.xml 文件中的 中添加一个 。确保将正确的 元素添加到 元素。
    • 我们如何知道我们放置的意图过滤器是否正常工作或按预期工作?
    • @JasonWan:使用您认为与&lt;intent-filter&gt; 匹配的Intent 调用startActivity(),看看会发生什么。
    猜你喜欢
    • 2017-01-17
    • 2015-08-18
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2021-07-31
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多