有没有办法告诉主屏幕/启动器是否正在恢复活动(即调用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中的“应用程序”概念并不多 - 从某种意义上讲,它只有一个入口和出口点。
答案 0 :(得分:2)
你可以捕捉活动B上的后退按钮,并将额外的值传递给活动A.如果有额外的值,那么活动就会从按下活动B恢复,如果没有额外的值则活动是从隐藏中恢复过来。
答案 1 :(得分:2)
答案 2 :(得分:1)
活动A可以使用startActivityForResult()
启动活动B并使用onActivityResult()
检测活动B是否已完成?
答案 3 :(得分:0)
因此,最初问题的直接答案可能是:否。从(重新)开始/恢复的意图中,无法观察到从主屏幕通过图标启动活动或从“最近”屏幕恢复活动。
根据您要实现的目标,可以采用以下方法:
检查是否在您的活动中调用了onNewIntent
方法,以确定是否从启动程序中重新启动。作为前提,您需要在清单中将活动设置为singleTask / singleTop launchMode:
android:launchMode="singleTask"
根据您要实现的目标,这可能就足够了!但除此之外,您可能还必须处理用户按下“后退”按钮时发生的情况。默认行为是完成并破坏您的活动。因此,当从“最近”屏幕中选择它时,将启动它的全新副本。尽管不会{strong}调用onNewIntent
,但一切都会从头开始重建。如果您需要防止这种情况,可以使用:
override fun onBackPressed() {
moveTaskToBack(true)
}
最后,当您从自己发起的活动中“返回”时,也会{strong>不被调用。如果您还需要区分恢复活动的原因,则可以使用onNewIntent
开始第二个活动,以便在恢复活动时调用startActivityForResult
。
一种完全不同的方法是在清单中包含一个“启动器”活动,该活动直接调用您的“主要”活动并完成自身。调用主要活动时,您可以添加一个意图附加内容,使您可以区分主要活动是否是第一次启动。由于额外的内容会在onResumes上出现,因此请确保在您首次“使用”它时将其覆盖:
onActivityResult
以及从“启动器”活动开始时:
override fun onResume() {
super.onResume()
val firstLaunch = intent.getBooleanExtra(FIRST_LAUNCH, false)
intent.putExtra(FIRST_LAUNCH, false)
if (firstLaunch) {
// do something
}
}