Oto jak wygląda moja aplikacja:
- Użytkownik onResume () jest proszony o zalogowanie
- Jeśli użytkownik się zaloguje, może kontynuować korzystanie z aplikacji 3. Jeśli użytkownik wyloguje się w dowolnym momencie, chcę ponownie poprosić o zalogowanie
Jak mogę to osiągnąć?
Oto moja główna aktywność:
@Override
protected void onResume(){
super.onResume();
isLoggedIn = prefs.getBoolean("isLoggedIn", false);
if(!isLoggedIn){
showLoginActivity();
}
}
Oto moja aktywność logowania:
@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);
}
}
}
Po pomyślnym zalogowaniu się użytkownika:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
}
}
Problem polega na tym, że onResume () jest wywoływana przed onActivityResult (), więc po pomyślnym zalogowaniu użytkownika moja główna aktywność nie jest powiadamiana, ponieważ onResume () jest wywoływana jako pierwsza.
Gdzie jest najlepsze miejsce do proszenia o logowanie?
źródło
onActivityResult
jest to również wywoływane wcześniejonStart
, co jest uważane przez wiele osób za błąd: code.google.com/p/android/issues/detail?id=17787W przypadku fragmentów nie jest to nawet tak proste, jak
onActivityResult()
wywołanie przed wywołaniemonResume()
. Jeśli czynność, do której powracasz, została w międzyczasie usunięta, okaże się, że wywołania (na przykład)getActivity()
fromonActivityResult()
zwróci wartość null. Jeśli jednak działanie nie zostało usunięte, wywołaniegetActivity()
zwróci działanie zawierające.Ta niespójność może być źródłem trudnych do zdiagnozowania defektów, ale możesz sprawdzić zachowanie swojej aplikacji, włączając opcję programisty „Nie zachowuj aktywności”. Mam tendencję do włączania tego - wolę raczej widzieć
NullPointerException
w fazie rozwoju niż w produkcji.źródło
Możesz rozważyć wyodrębnienie stanu logowania z działania. Na przykład, jeśli użytkownik może publikować komentarze, pozwól, aby akcja onPost oznaczała stan logowania i przejdź stamtąd, zamiast ze stanu aktywności.
źródło
Metody wywołania zwrotnego, takie jak,
onResume
nie są odpowiednimi miejscami do osiągnięcia żądanej funkcjonalności. Sugerowałbym utworzenie klasy i dodanie tam funkcji logowania / wylogowania. po odebraniu wywołania zwrotnego wylogowania, wywołaj funkcję logowania.źródło