Android挂起意图以恢复应用程序,而不启动活动

4

有没有办法在不启动Activity的情况下,将应用程序从后台恢复到前台?

我的应用程序中有20个活动。当我收到通知时,我无法知道现在顶部的是哪个活动。我能否以某种方式恢复整个应用程序到前台(而不是使用SingleTop、ReoderToTop标志调用某些活动等方法,只需将现有应用程序移动到前台)?

3个回答

3

你的代码过于复杂。你不需要一个虚拟的Activity。你应该像Android在从主屏幕启动应用程序时所做的那样。

在你的通知中使用“启动Intent”:

val intent = getPackageManager().
                    getLaunchIntentForPackage("my.package.name")

如果您的应用程序已经在运行,则此操作将使应用程序回到前台,而不会创建任何新组件。如果应用程序尚未运行,则通过启动根Activity来启动应用程序。


谢谢您的回答,也许我做错了什么,但是使用这种方法后,即使应用程序已经在运行,它也会从启动活动完全重新启动。 - Bios90
1
你可能遇到了一个讨厌的Android bug。你是通过安装程序还是通过IDE(Android Studio)第一次启动应用程序的?如果是这样,请杀掉你的应用程序(设置,应用程序,强制停止),然后从主屏幕重新启动应用程序。然后将其推到后台并单击通知,看看问题是否仍然存在。 - David Wasser
另外,请在问题中发布您的清单,因为使用特殊的启动模式也可能会导致问题。 - David Wasser
我怀疑这不是一个“恶性的Android bug”,因为我和OP一样遇到了相同的行为。应用程序从启动活动开始,而不是返回上次离开的位置。这不像广告宣传的那样工作,或者缺少一些重要的上下文。 - Jack M
@JackM请开一个新问题并描述您的问题。试图在另一个问题的注释中处理这个问题是没有用的或有效的。 - David Wasser

0
我发现了一个解决方案,可能看起来很奇怪,但它是有效的。
1)创建一些虚拟活动。这个活动将被用作待定意图的起点。
class DummyPendingIntentActivity:AppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
    }
}

2) 在虚拟操作活动的onCreate方法中编写此逻辑。在此方法中,您可以检查堆栈中是否有任何活动,并在需要时恢复它们,或者您可以重新启动应用程序并启动您的“启动器”活动。

//Here we check if there any activities in stack
override fun onCreate(savedInstanceState: Bundle?)
{
    if(isTaskRoot)
    {
        //No previous activity running will restart app
        val intent = Intent(this,YourFirstLauncherAcitivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        startActivity(intent)
    }
    else
    {
        //Has some previous activity so will finish to show it
        finish()
    }
}

3) 在任何待处理的意图中调用此虚拟起始点,您将恢复您的应用程序或在需要时重新启动它。

val intent = Intent(context,DummyPendingIntentActivity::class.java)
val pendingIntent = PendingIntent.getActivity(AppClass.getApp(), 777, intent, 0)
...
setContentIntent(pendingIntent)

0

最近我遇到了一个问题,当应用程序在后台运行时,我必须通过点击推送通知来恢复顶部活动。我发现这个案例与您非常接近)

我通过在BaseActivityonResume()方法中保存顶部活动意图来解决这个问题,如下所示:

Intent currentActivityIntent = new Intent(this, getClass());
currentActivityIntent.addFlags(FLAG_ACTIVITY_NEW_TASK);
currentActivityIntent.addFlags(FLAG_ACTIVITY_SINGLE_TOP);
App.setCurrentActivityIntent(currentActivityIntent);

点击推送后,我会获取顶部活动意图。

你只需要使用flags获取最后一个顶部活动的意图: FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_SINGLE_TOP都需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接