是否在 onActivityResult() 之前调用了 onResume()?
Posted
技术标签:
【中文标题】是否在 onActivityResult() 之前调用了 onResume()?【英文标题】:Is onResume() called before onActivityResult()? 【发布时间】:2011-05-14 06:41:50 【问题描述】:这是我的应用的布局方式:
-
onResume() 用户被提示登录
如果用户登录,他可以继续使用该应用程序
3。如果用户随时退出,我想再次提示登录
我怎样才能做到这一点?
这是我的 MainActivity:
@Override
protected void onResume()
super.onResume();
isLoggedIn = prefs.getBoolean("isLoggedIn", false);
if(!isLoggedIn)
showLoginActivity();
这是我的登录活动:
@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() 是先调用的。
提示登录的最佳位置在哪里?
【问题讨论】:
【参考方案1】:实际上,对 onActivityResult 的调用发生在 onResume 之前(请参阅the docs)。您确定您实际上是在使用startActivityForResult
开始您想要的活动,并且您在将值返回给您的活动之前将调用活动的结果设置为RESULT_OK
?试着在你的onActivityResult
中加入一个Log
语句来记录该值并确保它被命中。另外,您在哪里设置 isLoggedIn
首选项的值?看来您应该在登录活动中将其设置为true
,然后再返回,但这显然没有发生。
编辑
The docs说:
当您的活动重新开始时,您将在 onResume() 之前立即收到此调用。
【讨论】:
我在用户登录后设置 isLoggedIn。查看我更新的代码。不知道怎么了? 你是对的,onActivityResult() 在 onResume() 之前被调用。不知道为什么我的偏好被读错了? 注意onActivityResult
也是在onStart
之前调用的,这被很多人认为是bug:code.google.com/p/android/issues/detail?id=17787【参考方案2】:
对于片段,它甚至不像在调用onResume()
之前调用onActivityResult()
那样简单。如果您要返回的活动在此期间被处理掉,您会发现从 onActivityResult()
调用(例如)getActivity()
将返回 null。但是,如果该活动尚未被释放,则对getActivity()
的调用将返回包含活动。
这种不一致可能会导致难以诊断的缺陷,但您可以通过启用开发人员选项“不保留活动”来检查应用程序的行为。我倾向于保持打开状态 - 我宁愿看到 NullPointerException
在开发中而不是在生产中。
【讨论】:
【参考方案3】:您可能需要考虑从活动中抽象出登录状态。例如,如果用户可以发布 cmets,则让 onPost 操作 ping 登录状态并从那里开始,而不是从活动状态开始。
【讨论】:
【参考方案4】:像onResume
这样的回调方法不适合实现所请求的功能。
我建议开设一个课程并在那里添加登录/注销功能。
当收到注销回调时,调用登录功能。
【讨论】:
以上是关于是否在 onActivityResult() 之前调用了 onResume()?的主要内容,如果未能解决你的问题,请参考以下文章
在 onActivityResult 之前和之后调用 onCreate
Android P onStart 在 onActivityResult 之前调用
Android P onStart在onActivityResult之前调用
Android ACTION_IMAGE_CAPTURE Intent 在返回 onActivityResult 之前拍照时间歇性崩溃