我们要求用户在第一次启动应用时强制设置密码。因此,我们使用launchMode=singleTask
进行主要活动,使用startActivityForResult
启动密码设置活动。
如果用户从密码设置页面回退,我们也希望用户返回他们的家中,以便我们将代码放入onActivityResult
中的主要活动,如果收到RESULT_CANCELLED
。但是,如果用户点击主页并重新进入我们的应用程序,我们希望再次显示密码设置页面。但在这种情况下,它将被销毁(因为主要活动的launchMode
是singleTask
)并且还会将RESULT_CANCELLED
返回到我们的主要活动,从而导致它完成。
所以问题来自主要活动,我们无法区分回击和点击主页然后重新进入应用程序。
在保持launchMode
为singleTask
的同时,是否仍然满足此要求?
答案 0 :(得分:0)
onBackPressed()
当活动检测到用户按下背面时调用 键。默认实现只完成当前活动, 但你可以覆盖它来做任何你想做的事。
http://developer.android.com/reference/android/app/Activity.html#onBackPressed%28%29
&安培;&安培; 主屏幕 onPause()
(虽然它可能是由于其他事情也像你的下一个活动或切换到另一个应用程序) http://developer.android.com/reference/android/app/Activity.html#onPause%28%29
更新:
为什么不使用Sharedpreferences并检查应用是否是第一次运行并且设置了密码/休息字段而不是使用您现在使用的方法。
答案 1 :(得分:0)
我最近遇到了一个非常类似的问题。
我建议您在获得RESULT_CANCELLED
后实际上没有完成应用。
取而代之的是:
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == Activity.RESULT_CANCELED) {
if (/*TEST IF A USER IS SIGNED IN*/) {
//IF SIGNED IN PROCEED TO MAIN ACTIVITY
}
// OTHERWISE FORCE THEM TO SIGNIN/REGISTER/WHATEVER AGAIN
// WITH ANOTHER CALL TO startActivityForResult
...
这是解决问题的信封方法的背面,但这种模式对我有用。
对我来说,我的身份验证/注册都是在Abstarct Class
扩展Activity
。然后我的每个活动都扩展了这个课程。我将Auth / Reg方法调用放在此onResume()
的{{1}}。
在Abstarct Class
方法中启动startActivityForResult
并且失败时我没有onResume()
该活动,只是让应用程序继续运行并让该类处理哪个Reg / Auth表单当下。它将通过检查各种标志来确定它将要执行的操作。
这种方法的另一个好处是,每次使用这个抽象类时,每个finish()
都可以获得安全检查的额外好处。