带有startActivityForResult的android启动模式单任务
我们要求用户在首次启动应用程序时强制设置密码。因此,我们的主要活动是带有startActivityForResult的android启动模式单任务,android,android-activity,Android,Android Activity,我们要求用户在首次启动应用程序时强制设置密码。因此,我们的主要活动是launchMode=singleTask,它使用startActivityForResult启动密码设置活动 如果用户从密码设置页面点击返回,我们还希望用户返回他们的家,因此,如果收到结果\u取消,我们将代码放在其onActivityResult中以完成主要活动。但是,如果用户点击主页并重新进入我们的应用程序,我们希望再次显示密码设置页面。但在这种情况下,它将被销毁(因为主活动的启动模式是单任务),并将结果_CANCELLED
launchMode=singleTask
,它使用startActivityForResult
启动密码设置活动
如果用户从密码设置页面点击返回,我们还希望用户返回他们的家,因此,如果收到结果\u取消
,我们将代码放在其onActivityResult
中以完成主要活动。但是,如果用户点击主页并重新进入我们的应用程序,我们希望再次显示密码设置页面。但在这种情况下,它将被销毁(因为主活动的启动模式
是单任务
),并将结果_CANCELLED
返回给主活动,从而使其完成
因此,问题在于主要活动,我们无法区分回拨和回拨,然后重新进入应用程序
在将启动模式保持为单任务的同时,是否仍能满足此要求?onBackPressed()用于回击
当活动检测到用户按下背部时调用
钥匙默认实现只是完成当前活动,
但是你可以覆盖它来做任何你想做的事
&&
onPause()用于主屏幕
(虽然这可能是由于其他原因,例如您的下一个活动或切换到其他应用程序)
更新:
为什么不使用SharedReferences并检查应用程序是否是第一次运行,是否设置了密码/rest字段,而不是使用您现在使用的方法。onBackPressed()用于回击
当活动检测到用户按下背部时调用
钥匙默认实现只是完成当前活动,
但是你可以覆盖它来做任何你想做的事
&&
onPause()用于主屏幕
(虽然这可能是由于其他原因,例如您的下一个活动或切换到其他应用程序)
更新:
为什么不使用SharedReferences并检查应用程序是否是第一次运行,是否设置了密码/rest字段,而不是使用您现在使用的方法。我最近遇到了一个非常类似的问题
我的建议是,当你得到取消的结果时,你实际上并没有完成应用程序
相反,你可以这样做:
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类中完成的。然后,我的每个活动都扩展了这个类。我将Auth/Reg方法调用放在这个Abstarct类的onResume()
中
当在onResume()
方法中启动startActivityForResult
并失败时,我不finish()
活动,只让应用程序继续,让类处理要显示的注册表/身份验证表单。它将通过检查各种标志来确定要执行的操作
这种方法的额外好处是,每一个可能扩展这个抽象类的活动
在每次使用它时都会获得安全检查的额外好处。我最近遇到了一个非常类似的问题
我的建议是,当你得到取消的结果时,你实际上并没有完成应用程序
相反,你可以这样做:
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类中完成的。然后,我的每个活动都扩展了这个类。我将Auth/Reg方法调用放在这个Abstarct类的onResume()
中
当在onResume()
方法中启动startActivityForResult
并失败时,我不finish()
活动,只让应用程序继续,让类处理要显示的注册表/身份验证表单。它将通过检查各种标志来确定要执行的操作
这种方法的附加好处是,每个可能扩展这个抽象类的活动
在每次使用它时都会获得安全检查的附加好处。重写onBackPressed()是个好主意,但我认为我们不能在onPause()中设置不同的结果。例如,如果有来电,我们不希望密码设置活动完成。根据文档,它说如果活动崩溃,它将返回结果\u CANCELLED。在这种情况下,我们想离开家。那么,我们如何区分用户按下主页和重新输入与密码设置页面崩溃?覆盖onBackPressed()是一个好主意,但我认为我们不能在onPause()中设置不同的结果。例如,如果有来电,我们不希望密码设置活动完成。根据文档,它说如果活动崩溃,它将返回结果\u CANCELLED。在这种情况下,我们想离开家。那么,我们如何区分用户按下主页和重新输入与密码设置页面崩溃?