OnRestart vs. OnResume – Android生命周期问题

我的最终目标是让一个应用程序运行一段代码,当它(应用程序,而不是活动)被打开后(从主屏幕返回等)…

根据活动生命周期,这应该是基于每个活动的onRestart()事件(至少我如何解释它)

onRestart()onResume()都被调用,无论我是否返回应用程序中的Activity(后退按钮)以及何时调用应用程序。

鉴于此图 在此处输入图像描述

我这样解释:

  • RED =应用程序内活动之间的移动
  • BLUE =移动到应用程序之外的活动

我的理解不正确吗?

编辑 (澄清具体用例)

我正在尝试使用onRestart()来复制onCreate()中的一些安全逻辑(PINvalidation),但即使按下应用程序内的后退按钮,它也会被调用…

这是因为除非您使用片段,否则应用程序中的每个“屏幕”都是一个新活动,当您单击后退按钮时,它会重新启动之前页面的活动。

如果我理解你想要正确做什么,你想把你的代码放在onCreate上,而不是onRestart。

请参阅评论线索以获得答案

我的观察是,很难将生命周期事件与设备或模拟器上的用户行为联系起来。 暂停应用程序的位置,如果设备需要内存或想要恢复资源,它将终止活动,从而导致调用onCreate。 有太多场景可以构建一个足够的状态机来告诉自己“如何”或“为什么”终止您的活动。

我发现管理它的唯一方法是创建一个服务来保存应用程序状态并手动管理状态。 问题是尝试使用Activity状态来管理应用程序状态。 活动设计似乎有局限性,只是使其成为实现您所述目标的不良选择。

以下是如何做到这一点: –

  1. 有一个基本活动,您的所有活动都来自。

  2. 加入基础活动: –

     int nAppState; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); nAppState = 0; . . } protected override void OnStop() { AppState(); base.OnStop(); } public static int IMPORTANCE_BACKGROUND = 400; protected override void AppState() { ActivityManager am = (ActivityManager)GetSystemService(Context.ActivityService); IList list2 = am.RunningAppProcesses; foreach (ActivityManager.RunningAppProcessInfo ti in list2) { if (ti.ProcessName.ToLower() == "com.mycompany.myapp") { nAppState = ti.Importance; break; } } } protected override void OnRestart() { base.OnRestart(); if (nAppState == IMPORTANCE_BACKGROUND) { // Show a log in screen RunOnUiThread(delegate { StartActivity(new Intent(this, typeof(LoginAppearActivity))); }); nAppState = 0; } } 
  3. 请注意,这是在Mono C#中,它将是相同的Java代码,我会留给你转换它!

是的,你对红色和蓝色的断言是正确的。

但是,请注意onPause()和onStop()的备用路径。 因记忆原因而被杀的进程是a)你无法控制,如果你只使用onRestart()来检测“返回”活动,你将感觉不到。

您可以通过在调用startActivity(intent)之前设置一些标志来避免/删除堆栈中的活动来避免以前的活动:

 intent.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 

这将避免当前活动在后退时被调用。 或者,您也可以ovverride当前活动的onBackPressed()方法。