【问题标题】:Android launchmode="singleTask" does not work as expectedAndroid launchmode="singleTask" 无法按预期工作
【发布时间】:2010-11-12 21:10:13
【问题描述】:

我有一个在后台运行的应用程序,并通过通知系统显示错误消息。这个通知有一个pendingIntent,它可以返回应用程序的主屏幕。在这个主屏幕上,我设置了launchmode="singleTask"。正如我从 Android 开发指南中了解到的那样,这应该意味着我的主要活动将只有一个实例。

但是,如果用户当时正在查看该活动(或应用程序中的另一个活动),并去触摸通知以清除它,它会继续并将该活动的另一个副本放在堆栈上,所以如果我按了后退按钮,它将再次返回主屏幕(从主屏幕)。

为什么要这样做?

【问题讨论】:

    标签: android


    【解决方案1】:

    你几乎是在回答你自己的问题;)

    尝试使用:

    android:launchMode="singleInstance"
    

    但请注意,如果您正在执行类似 startActivityForResult 之类的任何操作 - 您将永远不会收到结果!

    更新:

    如果您想使用 onNewIntent 接收新的 Intent 数据:

    public void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);
        setIntent(intent);
    }
    

    这会将应用程序在您使用 getIntent() 时返回的意图更改为传递给 onNewIntent 的新意图。

    【讨论】:

    • 好吧,我继续尝试使用 singleInstance。不幸的是,它的行为仍然相同。
    • 再次查看文档后,我想知道是否需要在主要活动中覆盖 onNewIntent(),但我不知道该怎么做。
    • Ogre - 查看更新以获取有关使用 onNewIntent() 的信息并查看Android “single top” launch mode and onNewIntent method
    • 好的,所以我在阅读后做了一些测试。事实证明,它从不调用 onNewIntent。所以我能得出的唯一结论是它根本没有按照文档所说的那样做。
    • 我在这种情况下所做的一件事是创建一个单独的函数来处理从 getIntent() 中提取的捆绑包附加内容。这实际上是相当容易的。基本上,我从 onCreate() 中获取了所有这些逻辑并传入 Intent。现在可以从 onCreate() 或 onNewIntent() 调用此函数
    【解决方案2】:

    查看activity.launchmode的文档。

    我遇到了类似的问题,用android:launchMode="singleInstance"解决了。

    【讨论】:

    • 这也是我的解决方案
    【解决方案3】:

    在我看来,如果用户选择通知,您想要以下行为:

    • 如果应用程序已经在任务中运行,只需将该任务置于前台并显示恰好位于 Activity 堆栈顶部的任何 Activity。

    • 如果应用尚未在任务中运行,请在新任务中启动应用的主要活动。

    如果这是您所追求的行为,则您不需要(或不想要)任何特殊的启动模式。请参阅我对这个问题的回答:Notification to restore a task rather than a specific activity?

    这应该做你想做的。

    【讨论】:

    • 如何在后台返回应用程序(从服务)?
    • @yanivtwin Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); startActivity(intent); 这会将任务从后台带到前台,或者如果应用程序尚未运行,则启动新的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多