Ich habe versucht, mich von meiner App abzumelden, wenn der Benutzer auf Logout klickt. Es funktioniert einwandfrei, falls der Benutzer nach dem Anmelden abschließt, ohne die App zu schließen, wenn er sich abgemeldet hat Anmeldeseite nach dem Anmelden. Wenn der Benutzer nach dem Anmelden die Anwendung schließt und sich dann abmeldet, wird die Anmeldeseite nicht angezeigt, und es wird mir eine leere Seite angezeigt
Code
public class AppState {
private static AppState singleInstance;
private boolean isLoggingOut;
private AppState() {
}
public static AppState getSingleInstance() {
if (singleInstance == null) {
singleInstance = new AppState();
}
return singleInstance;
}
public boolean isLoggingOut() {
return isLoggingOut;
}
public void setLoggingOut(boolean isLoggingOut) {
this.isLoggingOut = isLoggingOut;
}
}
OnClick der Abmeldung
logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
SharedPreferences myPrefs = getSharedPreferences("MY",
MODE_PRIVATE);
SharedPreferences.Editor editor = myPrefs.edit();
editor.clear();
editor.commit();
AppState.getSingleInstance().setLoggingOut(true);
Log.d(TAG, "Now log out and start the activity login");
Intent intent = new Intent(HomePage.this,
LoginPage.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
IN der LoginAktivität
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MAIN_ACTIVITY_REQUEST_CODE) {
if (!AppState.getSingleInstance().isLoggingOut()) {
finish();
} else {
AppState.getSingleInstance().setLoggingOut(false);
super.onActivityResult(requestCode, resultCode, data);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
Bitte schlage mir vor, was ich falsch gemacht habe
Nach Ihren Vorschlägen von Vivek Bhusal habe ich versucht, sharedpref zu verwenden
HomePage Logout Geklickt
logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
SharedPreferences myPrefs = getSharedPreferences("Activity",
MODE_PRIVATE);
SharedPreferences.Editor editor = myPrefs.edit();
editor.clear();
editor.commit();
//AppState.getSingleInstance().setLoggingOut(true);
setLoginState(true);
Log.d(TAG, "Now log out and start the activity login");
Intent intent = new Intent(HomePage.this,
LoginPage.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
private void setLoginState(boolean status) {
SharedPreferences sp = getSharedPreferences("LoginState",
MODE_PRIVATE);
SharedPreferences.Editor ed = sp.edit();
ed.putBoolean("setLoggingOut", status);
ed.commit();
}
Auf der Login-Seite
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
SharedPreferences sp = getSharedPreferences("LoginState",
MODE_PRIVATE);
boolean stateValue = sp.getBoolean("setLoggingOut", false);
if (requestCode == MAIN_ACTIVITY_REQUEST_CODE) {
if (!stateValue) {
finish();
} else {
//AppState.getSingleInstance().setLoggingOut(false);
updateLoginState(false);
super.onActivityResult(requestCode, resultCode, data);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
Immer noch das gleiche Problem mit einem leeren Bildschirm, wenn ich die App erneut starte und dann die Abmeldung durchführe.
Ich habe festgestellt, dass Ihre Abmeldeschaltfläche die Login-Aktivität startet, die Home Page-Aktivität jedoch nicht beendet. So schließen Sie die Homepage:
Intent intent = new Intent(HomePage.this, LoginPage.class);
startActivity(intent);
finish() // This call is missing.
Um es von der Anmeldeseite aus zu öffnen:
Intent intent = new Intent(LoginPage.this, HomePage.class);
startActivity(intent);
finish()
Beenden Sie eine Aktivität, nachdem Sie eine andere gestartet haben. Auf diese Weise wird Ihr Task-Stack nur eine Aktivität haben, d. H. Überprüfen Sie die Beispiel-App, die von Vivek Bhusal veröffentlicht wurde.
Ich schlage vor, diese SO - Frage , die akzeptierte Antwort und auch diese Antwort zu lesen, um mehr über das Abmelden und einige Vorbehalte mit Intent.FLAG_ACTIVITY_CLEAR_TOP
zu erfahren ist nicht wirklich notwendig.
Ich hatte ein ähnliches Problem in einer meiner Bewerbungen. Aber ich habe die Lösung gefunden. Das Problem ist, dass der boolesche Wert, den Sie in Ihrer Klasse definiert haben, isloggingout ist, der nach dem Schließen der Anwendung zurückgesetzt wird. Es ist eine Variable, die Ihren Wert speichert, bis Ihre Anwendung geöffnet ist. Sobald Sie Ihre Anwendung schließen, wird sie zurückgesetzt und Ihre Anwendung wird nicht funktionieren. Ich empfehle Ihnen, Sharedpreference zu verwenden, um diesen Wert zu speichern.
Viel Glück
Updates mit Beispielanwendung:
Hauptaktivität.Java
public class MainActivity extends Activity {
SharedPreferences SM;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginpage);
SM = getSharedPreferences("userrecord", 0);
Boolean islogin = SM.getBoolean("userlogin", false);
if(islogin){
Intent intent = new Intent(MainActivity.this, Dashboard.class);
startActivity(intent);
finish();
return;
}
Button login = (Button) findViewById(R.id.login);
final EditText ETuser = (EditText) findViewById(R.id.editText1);
final EditText ETpass = (EditText) findViewById(R.id.editText2);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
String user = ETuser.getText().toString();
String pass = ETpass.getText().toString();
if(user.equalsIgnoreCase("admin") && pass.equalsIgnoreCase("admin")){
Editor edit = SM.edit();
edit.putBoolean("userlogin", true);
edit.commit();
Intent intent = new Intent(MainActivity.this, Dashboard.class);
startActivity(intent);
finish();
}else{
Toast.makeText(getApplicationContext(), "Username/Password Invalid", Toast.LENGTH_LONG).show();
}
}
});
}
}
Dashboard.Java
public class Dashboard extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button logout = (Button) findViewById(R.id.logout);
logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
SharedPreferences SM = getSharedPreferences("userrecord", 0);
Editor edit = SM.edit();
edit.putBoolean("userlogin", false);
edit.commit();
Intent intent = new Intent(Dashboard.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}
loginpage.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:padding="10dp" >
<EditText
Android:id="@+id/editText1"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ems="10" >
<requestFocus />
</EditText>
<EditText
Android:id="@+id/editText2"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ems="10"
Android:inputType="textPassword" />
<Button
Android:id="@+id/login"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="login" />
</LinearLayout>
activity_main.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Hello User" />
<Button
Android:id="@+id/logout"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView1"
Android:layout_below="@+id/textView1"
Android:layout_marginLeft="50dp"
Android:layout_marginTop="57dp"
Android:text="Logout" />
</RelativeLayout>
Versuchen Sie dieses Beispiel und hoffen Sie, dass dies Ihnen helfen wird
if (!AppState.getSingleInstance().isLoggingOut()) {
findest du diese Aussage richtig? Da ich gesehen habe, wann diese Bedingung zutrifft, beenden Sie die Aktivität. Ich denke, das bedeutet Logout, aber isLoggingOut sollte wahr sein. habe ich recht??
Dieser Code wird für die Abmeldung von der App verwendet
Intent logoutintent = new Intent(this, LoginActivity.class);
startActivity(logoutintent);
SharedPreferences loginSharedPreferences;
loginSharedPreferences = getSharedPreferences(
LoginActivity.MyPREFERENCES, Context.MODE_PRIVATE);
Editor editor = loginSharedPreferences.edit();
editor.putString("UniqueId", "");
editor.commit();
finish();
onNewIntent()
sollte in singleTop
-Aktivitäten verwendet werden . Außerdem sehe ich keinen startActivityForResult()
-Aufruf der Anmeldeseite/Aktivität.
Leere Seite bedeutet, dass Ihre Aktivität ihre Ansicht nicht eingerichtet hat (mit setContentView()
).
Ich würde vorschlagen, Ihre "Abmelden" -Kontrollen und setContentView()
auf onResume()
der Anmeldeseite/Aktivität zu verschieben.
case R.id.drawer_item_logout: // Name der Abmeldeschaltfläche
AlertDialog.Builder builder=new AlertDialog.Builder(Home.this); //Home is name of the activity
builder.setMessage("Do you want to exit?");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
finish();
Intent i=new Intent();
i.putExtra("finish", true);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // To clean up all activities
//startActivity(i);
finish();
}
});
builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert=builder.create();
alert.show();
break;