onActivityResult()之前是否调用onResume()?

时间:2010-11-23 05:39:42

标签: java android android-activity android-lifecycle activity-lifecycle

以下是我的应用的布局:

  1. onResume()用户被提示登录
  2. 如果用户登录,他可以继续使用该应用 第3。如果用户随时退出,我想再次提示登录
  3. 我怎样才能做到这一点?

    这是我的MainActivity:

    @Override
        protected void onResume(){
            super.onResume();
    
            isLoggedIn = prefs.getBoolean("isLoggedIn", false);
    
            if(!isLoggedIn){
                showLoginActivity();
            }
        }
    

    这是我的LoginActivity:

    @Override
            protected void onPostExecute(JSONObject json) {
                String authorized = "200";
                String unauthorized = "401";
                String notfound = "404";
                String status = new String();
    
                try {
                    // Get the messages array
                    JSONObject response = json.getJSONObject("response");
                    status = response.getString("status");
    
                    if(status.equals(authorized)){
                        Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                        prefs.edit().putBoolean("isLoggedIn",true);
    
                        setResult(RESULT_OK, getIntent());
                        finish();
                    }
                    else if (status.equals(unauthorized)){
                        Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
                         prefs.edit().putBoolean("isLoggedIn",true);
                    }
                    else if(status.equals(notfound)){
                        Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
                         prefs.edit().putBoolean("isLoggedIn",true);
                    }
                } catch (JSONException e) {
                    System.out.println(e);
                } catch (NullPointerException e) {
                    System.out.println(e);
                }
            }
        }
    

    用户成功登录后:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
            }
        }
    

    问题是,在onActivityResult()之前调用onResume(),因此当用户成功登录时,我的主活动不会得到通知,因为首先调用onResume()。

    提示登录的最佳位置在哪里?

4 个答案:

答案 0 :(得分:88)

对onActivityResult的调用实际上发生在onResume之前(参见the docs)。您确定在实际使用startActivityForResult启动了所需的活动,并且在将值返回到您的活动之前,您将调用的活动的结果设置为RESULT_OK吗?尝试在Log中添加onActivityResult语句来记录该值并确保其被点击。另外,您在哪里设置isLoggedIn偏好的值?您似乎应该在登录活动中将其设置为true,然后才会返回,但这显然不会发生。

答案 1 :(得分:28)

使用片段,在调用onActivityResult()之前调用onResume()并不简单。如果您要返回的活动在过渡期间被处理掉,您会发现来自getActivity()的(例如)onActivityResult()的调用将返回null。但是,如果活动尚未处理,则对getActivity()的调用将返回包含活动。

这种不一致可能是难以诊断的缺陷的来源,但您可以通过启用开发人员选项“不要保留活动”来检查应用程序的行为。我倾向于保持这种状态 - 我宁愿在开发中看到NullPointerException而不是在生产中。

答案 2 :(得分:2)

您可能需要考虑从活动中抽象出登录状态。例如,如果用户可以发布评论,请让onPost操作ping登录状态并从那里开始,而不是从活动状态开始。

答案 3 :(得分:0)

onResume这样的回调方法不适用于实现所请求的功能。 我建议您上一堂课并在其中添加登录/注销功能。 当收到退出回调时,请调用登录功能。