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