【发布时间】:2020-03-24 22:51:05
【问题描述】:
有没有办法在不启动活动的情况下从后台到前台恢复应用程序?
我的应用中有 20 个活动。当我收到通知时,我不知道现在哪个活动最重要。我可以以某种方式将整个应用程序恢复到前台(不使用 SingleTop、ReoderToTop 标志等调用某些活动,而只是将现有应用程序移动到前台)?
【问题讨论】:
标签: android push-notification android-pendingintent
有没有办法在不启动活动的情况下从后台到前台恢复应用程序?
我的应用中有 20 个活动。当我收到通知时,我不知道现在哪个活动最重要。我可以以某种方式将整个应用程序恢复到前台(不使用 SingleTop、ReoderToTop 标志等调用某些活动,而只是将现有应用程序移动到前台)?
【问题讨论】:
标签: android push-notification android-pendingintent
您的代码太复杂了。你不需要假人Activity。你应该做 Android 从主屏幕启动应用程序时所做的事情。
在通知中使用“启动意图”:
val intent = getPackageManager().
getLaunchIntentForPackage("my.package.name")
如果您的应用已经在运行,这会将应用带到前台,而无需创建任何新组件。如果应用尚未运行,这将通过启动根 Activity 来启动应用。
【讨论】:
我找到了一种解决方案,它可能看起来很奇怪,但它确实有效。
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)
【讨论】:
最近我遇到了一个问题,我必须通过在应用程序处于后台时单击推送通知来恢复顶级活动。我在你附近发现了这个案例)
我通过在BaseActivity 的onResume() 方法中保存顶级活动意图来解决此问题,如下所示:
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_TASK 和 FLAG_ACTIVITY_SINGLE_TOP。
【讨论】: