Выход из приложения Android
Я попытался выйти из своего приложения, когда пользователь нажмет на Logout.It работает нормально, если пользователь после входа в систему, не закрывая приложение, если он выполнил выход из системы. Затем он работает правильно. Кнопка будет неэффективной в случае снова отобразить страницу входа после входа в систему
Но когда пользователь после входа в систему закрывает приложение, а затем выходит из системы, страница входа в систему не показывает, что она показывает мне пустую страницу.
Код
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 выхода
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);
}
});
В 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);
}
Пожалуйста, предложите мне, что я сделал неправильно в этом
После ваших предложений Vivek Bhusal я попытался использовать sharedpref
Выход на главную страницу Нажмите
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();
}
На странице Вход в систему
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);
}
}
По-прежнему та же проблема показывает пустой экран, когда я снова перезапускаю приложение, а затем выполняю выход из системы.
Ответы
Ответ 1
Я заметил, что ваша кнопка выхода из системы запускает активность входа, но не завершает работу домашней страницы. Чтобы закрыть домашнюю страницу:
Intent intent = new Intent(HomePage.this, LoginPage.class);
startActivity(intent);
finish() // This call is missing.
Чтобы открыть его, на странице входа в систему:
Intent intent = new Intent(LoginPage.this, HomePage.class);
startActivity(intent);
finish()
Завершите одно действие после запуска другого. Таким образом, ваш стек задач будет иметь только одно действие, то есть нет предыстории. Посмотрите пример приложения, опубликованного Вивеком Бхусалом.
Я предлагаю прочитать этот вопрос SO, принятый ответ, а также этот ответ для получения дополнительных идей о том, как выполнить выход из системы и некоторые оговорки с помощью Intent.FLAG_ACTIVITY_CLEAR_TOP
, что в вашем случае не обязательно.
Ответ 2
if (!AppState.getSingleInstance().isLoggingOut()) {
Считаете ли вы, что это утверждение верно? потому что я видел, когда это условие верно, вы завершаете активность, я думаю, что это означает, что выход из системы, но isLoggingOut должен быть правдой, однако вы проверяете, является ли это ложью, которую вы вызываете. я прав?
Ответ 3
У меня была аналогичная проблема в одном из моих приложений; Но я получил решение. Проблема в том, что логическое вы определили isloggingout в своем классе, оно сбрасывается после закрытия вашего приложения. Его переменная, которая сохраняет ваше значение, пока ваше приложение не будет открыто. Как только вы закроете приложение, оно получит reset, и ваше приложение не будет работать. Я предлагаю вам использовать Sharedpreference для сохранения этого значения.
Удачи.
Обновления с примером приложения:
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();
}
}
});
}
}
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>
Попробуйте этот пример и надеюсь, что это поможет вам
Ответ 4
Вы можете использовать класс SharedPreferences
в android. Он может использовать, чтобы сохранить значение и загрузить его снова. Это docs и tutorial.
Ответ 5
onNewIntent()
следует использовать в действиях singleTop
.
Кроме того, я не вижу вызов startActivityForResult()
на странице входа/активности.
Пустая страница означает, что ваша активность не настроила свой вид (с помощью setContentView()
).
Я бы предложил переместить ваши "выходы" и setContentView()
на onResume()
на странице входа/активности.
Ответ 6
Этот код используется для выхода из приложения
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();
Ответ 7
case R.id.drawer_item_logout://имя кнопки выхода
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]]()