2

我们需要强制用户在他/她第一次启动应用程序时设置密码。所以我们有我们的主要活动,使用launchMode=singleTask它开始密码设置活动startActivityForResult

如果他/她从密码设置页面点击返回,我们还希望用户回到他们的家,因此我们将完成主要活动的代码放入其中,onActivityResult如果它收到RESULT_CANCELLED. 但是,如果用户点击主页并重新进入我们的应用程序,我们希望再次显示密码设置页面。但在这种情况下,它将被销毁(因为主要活动launchModesingleTask)并返回RESULT_CANCELLED到我们的主要活动导致它完成。

所以问题出在主要活动上,我们无法区分点击返回和点击主页然后重新进入应用程序。

无论如何,在保持launchModeas的同时满足这个要求singleTask吗?

4

2 回答 2

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()thisAbstarct Class中。

startActivityForResult在方法中启动aonResume()并且失败时,我不finish()进行活动,而只是让应用程序继续并让类处理要呈现的 Reg/Auth 表单。它将通过检查各种标志来确定它要执行的操作来执行此操作。

这种方法的额外好处是,每一个Activity可能扩展这个抽象类的东西都会在每次使用它时获得安全检查的额外好处。

于 2012-11-07T01:24:11.957 回答
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 并检查应用程序是否首次运行并设置密码/休息字段,而不是使用您现在使用的方法。

于 2012-09-07T07:08:03.580 回答