webentwicklung-frage-antwort-db.com.de

Abmelden von der Anwendung Android

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.

10
Developer

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.

20
Rafa

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

0
user98239820
  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??

0
budaancamanyak

Sie können die SharedPreferences-Klasse in Android verwenden. Es kann den Wert speichern und erneut laden. Dies ist das docs und Tutorial .

0
RussVirtuoso

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();
0

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.

0
Saran

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;

[1]

0
Geeta Naiker