我的最终目标是让一个应用程序运行一个代码块,当它(应用程序,而不是活动)被打开后(从主屏幕返回等等)打开它。
根据活动生命周期,这应该是基于每个活动的onRestart()
事件(至少我如何解释它)
我是否正在调用onRestart()
和onResume()
,无论我是返回应用程序中的Activity(后退按钮)还是应用程序被重新调用。
鉴于此图
我这样解释:
我的理解不正确吗?
编辑(澄清具体用例)
我正在尝试使用onRestart()来复制onCreate()中的一些安全逻辑(PIN Validation),但即使我按下应用程序中的后退按钮,它也会被调用...
答案 0 :(得分:4)
我的观察是,很难将生命周期事件与设备或模拟器上的用户行为联系起来。在您的应用暂停的情况下,如果设备需要内存或想要恢复资源,它将终止活动,从而导致调用onCreate。有太多场景可以构建一个足够的状态机来告诉自己“如何”或“为什么”终止你的活动。
我发现管理它的唯一方法是创建一个服务来保存应用程序状态并手动管理状态。问题是尝试使用Activity状态来管理应用程序状态。活动设计似乎有局限性,只是使其成为实现您所述目标的不良选择。
答案 1 :(得分:1)
那是因为除非您使用片段,否则应用程序中的每个“屏幕”都是一个新活动,当您单击后退按钮时,它会重新启动之前页面的活动。
如果我理解你想要做什么,你想把你的代码放在onCreate上,而不是onRestart。
见答案评论
答案 2 :(得分:1)
以下是如何执行此操作: -
开展所有活动的基本活动。
添加到基本活动: -
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<ActivityManager.RunningAppProcessInfo> 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;
}
}
请注意,这是在Mono C#中,它与Java的代码相同,我会留给你转换它!
答案 3 :(得分:0)
是的,您对红色和蓝色的断言都是正确的。
但是,请注意onPause()和onStop()的备用路径。因记忆原因被杀的过程是a)你无法控制,如果你只使用onRestart()来检测“回来”活动,你将感觉不到。
答案 4 :(得分:0)
您可以选择通过在调用startActivity(intent)之前设置一些标志来避免/删除Stack中的活动来避免以前的活动:
intent.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
这将避免在按下时调用当前活动。或者,您也可以ovverride当前活动的onBackPressed()方法。