web-dev-qa-db-fra.com

Déconnexion de l'application Android

J'ai essayé de me déconnecter de mon application lorsque l'utilisateur clique sur Logout.Il fonctionne correctement dans le cas où l'utilisateur se connecte après avoir fermé sans fermer l'application s'il l'a déconnecté. Il fonctionne alors correctement. la page de connexion après la connexion Mais lorsque l'utilisateur, après la connexion, ferme l'application et qu'il se déconnecte, la page de connexion ne montre pas qu'elle affiche une page vierge pour moi. 

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;
    }
}

Cliquez sur la déconnexion

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 the LoginActivity

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

    }

S'il vous plaît suggérez-moi ce que j'ai fait de travers

Après vos suggestions de Vivek Bhusal j'ai essayé d'utiliser sharedpref 

Déconnexion HomePage Cliqué

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

Sur la Page de connexion

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);
        }
    }

Toujours le même problème montrant un écran vide quand je redémarre à nouveau l'application, puis fais la déconnexion.

10
Developer

J'ai remarqué que votre bouton de déconnexion démarre l'activité de connexion mais ne termine pas l'activité de la page d'accueil. Pour fermer la page d'accueil:

Intent intent = new Intent(HomePage.this, LoginPage.class);
startActivity(intent);
finish()  // This call is missing.

Pour l'ouvrir, à partir de la page de connexion:

Intent intent = new Intent(LoginPage.this, HomePage.class);
startActivity(intent);
finish()

Terminez une activité après en avoir commencé une autre. De cette façon, votre pile de tâches n’aura qu’une seule activité, c’est-à-dire sans historique. Consultez l'exemple d'application publié par Vivek Bhusal.

Je suggère de lire cette SO question , la réponse acceptée , et aussi cette réponse pour plus d’idées sur la façon de procéder à la déconnexion et quelques mises en garde avec Intent.FLAG_ACTIVITY_CLEAR_TOP, qui, dans votre cas , n'est pas vraiment nécessaire.

20
Rafa

J'ai eu le même problème dans l'une de mes applications; Mais j'ai la solution. Le problème est que le booléen que vous avez défini est isloggingout dans votre classe, il se réinitialise après la fermeture de votre application. C'est une variable qui stocke votre valeur jusqu'à ce que votre application soit ouverte. Dès que vous fermez votre application, celle-ci est réinitialisée et votre application ne fonctionnera plus. Je vous suggérerai d'utiliser Sharedpreference pour stocker cette valeur.

Bonne chance

Mises à jour avec exemple d'application:

MainActivity.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();
                }
            }
        });
    }

}

Tableau de bord.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>

Essayez cet exemple et espérez que cela vous aidera

0
user98239820
  if (!AppState.getSingleInstance().isLoggingOut()) {

pensez-vous que cette déclaration est correcte? parce que j’ai vu que lorsque cette condition est vraie, vous terminez l’activité, je pense que cela signifie que vous devez vous déconnecter, mais isLoggingOut devrait être vrai, mais vous devez vérifier si c’est faux et appeler fini. ai-je raison??

0
budaancamanyak

Vous pouvez utiliser la classe SharedPreferences dans Android. Il peut utiliser pour enregistrer la valeur et la charger à nouveau. Ceci est le docs et tutorial .

0
RussVirtuoso

Ce code est utilisé pour vous déconnecter de l'application

        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
Bhavinkumar Patel

La onNewIntent() devrait être utilisée dans singleTop activités . À part cela, je ne vois pas d'appel startActivityForResult() à Login Page/Activity.

Une page blanche signifie que votre activité n'a pas configuré sa vue (avec setContentView()).

Je suggèrerais de déplacer vos vérifications de "déconnexion" et setContentView() vers onResume() de la page/activité de connexion.

0
Saran

case R.id.drawer_item_logout: // nom du bouton de déconnexion

                    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