是在onActivityResult()之前调用onResume()吗?


79

这是我的应用程序的布局方式:

  1. 提示onResume()用户登录
  2. 如果用户登录,他可以继续使用应用程序 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();
        }
    }

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

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

Answers:


102

实际上,对onActivityResult的调用发生在onResume之前(请参阅docs)。您确定确实要启动想要的活动,startActivityForResult并且RESULT_OK在将值返回到活动之前将调用的活动的结果设置为吗?尝试只Log在您的语句中输入一个onActivityResult值以记录该值,并确保该值被击中。另外,您在哪里设置isLoggedIn首选项的值?似乎您应该true在登录活动中将其设置为,然后再返回,但这显然没有发生。

编辑

文档说:

重新启动活动时,您将在onResume()之前立即收到此呼叫。


我已在用户登录后设置isLoggedIn。请参阅我的更新代码。不知道怎么了?
Sheehan Alam

1
没错,onActivityResult()在onResume()之前被调用。不确定为什么我的偏好被错误地理解了吗?
Sheehan Alam

4
请注意,这onActivityResult也称为before onStart,很多人认为这是一个错误:code.google.com/p/android/issues/detail?
id=17787

30

对于片段,它甚至不像onActivityResult()调用之前那样简单onResume()。如果您要返回的活动在此期间已被处置,您会发现该呼叫(例如)getActivity()from的onActivityResult()将返回null。但是,如果尚未处理该活动,则对的调用getActivity()将返回包含的活动。

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


2

您可能要考虑从活动中抽象出登录状态。例如,如果用户可以发表评论,则让onPost操作对登录状态进行ping操作,然后从那里开始,而不是从活动状态开始。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.