有没有办法区分主屏幕上的Android Activity onResume?

时间:2011-01-25 02:03:08

标签: android

有没有办法告诉主屏幕/启动器是否正在恢复活动(即调用onResume)?

例如,如果我有一个包含两个活动的应用程序,A和B.

场景1: 活动A上的某些用户操作将调用活动B,将其带入前台 - 将活动A移动到后台。当活动A进入后台时,它会通过onPause()和onStop()。用户(现在在活动B上)完成活动或点击“后退”按钮,将活动A带回前台,从而导致onRestart(),onStart(),onResume()序列。

场景2: 如果用户在活动A位于前台时点击“主页”按钮,然后从启动器重新调用应用程序,则它将经历与场景1中相同的生命周期。用户点击“主页”按钮。活动通过onPause()和onStop()。用户再次启动应用程序,导致活动A返回到前台,再次通过与场景1中相同的onRestart(),onStart(),onResume()序列。

据我所知,活动无法知道它是如何恢复的,它只是知道它被带回了视野。事实上,我觉得Android中的“应用程序”概念并不多 - 从某种意义上讲,它只有一个入口和出口点。

4 个答案:

答案 0 :(得分:2)

你可以捕捉活动B上的后退按钮,并将额外的值传递给活动A.如果有额外的值,那么活动就会从按下活动B恢复,如果没有额外的值则活动是从隐藏中恢复过来。

答案 1 :(得分:2)

在场景2中,您的活动将获得onNewIntent调用,并将启动器意图传递给它。

答案 2 :(得分:1)

活动A可以使用startActivityForResult()启动活动B并使用onActivityResult()检测活动B是否已完成?

答案 3 :(得分:0)

因此,最初问题的直接答案可能是:否。从(重新)开始/恢复的意图中,无法观察到从主屏幕通过图标启动活动或从“最近”屏幕恢复活动。

根据您要实现的目标,可以采用以下方法:

  1. @superfell建议的内容:

检查是否在您的活动中调用了onNewIntent方法,以确定是否从启动程序中重新启动。作为前提,您需要在清单中将活动设置为singleTask / singleTop launchMode:

android:launchMode="singleTask"

根据您要实现的目标,这可能就足够了!但除此之外,您可能还必须处理用户按下“后退”按钮时发生的情况。默认行为是完成并破坏您的活动。因此,当从“最近”屏幕中选择它时,将启动它的全新副本。尽管不会{strong}调用onNewIntent,但一切都会从头开始重建。如果您需要防止这种情况,可以使用:

override fun onBackPressed() {
    moveTaskToBack(true)
}

最后,当您从自己发起的活动中“返回”时,也会{strong>不被调用。如果您还需要区分恢复活动的原因,则可以使用onNewIntent开始第二个活动,以便在恢复活动时调用startActivityForResult

  1. 发起人的活动和意图额外

一种完全不同的方法是在清单中包含一个“启动器”活动,该活动直接调用您的“主要”活动并完成自身。调用主要活动时,您可以添加一个意图附加内容,使您可以区分主要活动是否是第一次启动。由于额外的内容会在onResumes上出现,因此请确保在您首次“使用”它时将其覆盖:

onActivityResult

以及从“启动器”活动开始时:

override fun onResume() {
    super.onResume()
    val firstLaunch = intent.getBooleanExtra(FIRST_LAUNCH, false)
    intent.putExtra(FIRST_LAUNCH,  false)
    if (firstLaunch) {
      // do something
    }
}