以下是我的应用的布局:
我怎样才能做到这一点?
这是我的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()。
提示登录的最佳位置在哪里?
答案 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
这样的回调方法不适用于实现所请求的功能。
我建议您上一堂课并在其中添加登录/注销功能。
当收到退出回调时,请调用登录功能。