【问题标题】:Android pending intent to resume app, without starting activityAndroid挂起意图恢复应用程序,而不启动活动
【发布时间】:2020-03-24 22:51:05
【问题描述】:

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

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

【问题讨论】:

    标签: android push-notification android-pendingintent


    【解决方案1】:

    您的代码太复杂了。你不需要假人Activity。你应该做 Android 从主屏幕启动应用程序时所做的事情。

    在通知中使用“启动意图”:

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

    如果您的应用已经在运行,这会将应用带到前台,而无需创建任何新组件。如果应用尚未运行,这将通过启动根 Activity 来启动应用。

    【讨论】:

    • 感谢您的回答,可能是我做错了什么,但是使用这种方法,我的应用程序会从启动活动中完全重新启动,即使它已经在运行。
    • 您可能看到了一个令人讨厌的 Android 错误。您是第一次通过安装程序还是通过 IDE (Android Studio) 启动了您的应用程序?如果是这样,请终止您的应用程序(设置、应用程序、强制停止),然后从主屏幕重新启动应用程序。然后推到后台,点击你的通知,看看问题是否仍然存在。
    • 另外,请在问题中发布您的清单,因为使用特殊启动模式也可能导致问题。
    【解决方案2】:

    我找到了一种解决方案,它可能看起来很奇怪,但它确实有效。

    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)
    

    【讨论】:

      【解决方案3】:

      最近我遇到了一个问题,我必须通过在应用程序处于后台时单击推送通知来恢复顶级活动。我在你附近发现了这个案例)

      我通过在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

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 2013-11-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多