带有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。在这种情况下,我们想离开家。那么,我们如何区分用户按下主页和重新输入与密码设置页面崩溃?