簡體   English   中英

注銷時如何破壞活動?

[英]How to destroy the activity when logout?

我正在用android開發應用程序。 這樣,我就可以使用SharedPreferences通過會話管理進行登錄和注銷活動。 我的應用程序注銷,將數據存儲在sharedpreferences中,以保持會話成功完成。 當我從應用程序注銷(第二個活動)並呈現為第一個活動(登錄活動),但發生的情況是當我成功注銷后仍再次呈現到第二個活動並遇到某些版本(如2.3.3等)時,在模擬器上單擊后退按鈕例外

java.lang.RuntimeException: Unable to destroy activity {com.oj.bs/com.oj.bs.LoginActivity}: java.lang.NullPointerException

任何人都可以解決這個問題。 請參考以下代碼

以下是登錄活動代碼

sessionmngr = new SessionManager(getApplicationContext());

                    JSONObject json_user = jsonObj.getJSONObject("user");
                    sessionmngr.createLoginSession(id,json_user.getString(KEY_UNAME), 
                            json_user.getString(KEY_UEMAIL));
                     .
                     .

以下是會話管理

public class SessionManager {

SharedPreferences pref;
Editor editor;
Context contxt;
//shared pref mode
int PRIVATE_MODE = 0;
 // Sharedpref file name
private static final String PREF_NAME = "bookingScapePref";

// All Shared Preferences Keys
private static final String IS_LOGIN = "IsLoggedIn";
public static final String KEY_NAME = "name";
public static final String KEY_ID = "id";
public static final String KEY_EMAIL = "email";

public SessionManager(Context context) {
    super();
    this.contxt = context;
    pref = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
    editor = pref.edit();
    editor.commit();
}
/**
 * Create login session
 * */
public void createLoginSession(int id,String name, String email) {

    editor.putBoolean(IS_LOGIN,true);
    editor.putString(KEY_NAME, name);
    editor.putString(KEY_EMAIL, email);
    editor.putInt(KEY_ID, id);
    editor.commit();
}
/**
 * Get stored session data
 * */
public HashMap<String, String> getUserDetails() {
    HashMap<String, String> userDetails = new HashMap<String, String>();
    userDetails.put(KEY_NAME, pref.getString(KEY_NAME, null));
    userDetails.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
    return userDetails;
}
/**
 * Check login method will check user login status
 * */
public void checkLogin() {

    if (!this.isLoggedIn()) {
        Intent i = new Intent(contxt, LoginActivity.class);
        //closing all the activity
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //Add new Flag to start new Activity
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        contxt.startActivity(i);
    }
}

public void logoutUser() {
    //clearing all data from sharedPreferences
    editor.clear();
    editor.commit();
    Intent intnt = new Intent(contxt, LoginActivity.class);
    // Closing all the Activities
    intnt.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    // Add new Flag to start new Activity
    intnt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    // Staring Login Activity
    contxt.startActivity(intnt);
}

/**
 * Quick check for login
 * **/
// Get Login State
public boolean isLoggedIn(){
    return pref.getBoolean(IS_LOGIN, false);
}

}

這是第二項活動 ,我正在檢查會話

public class ProjectFragActivity extends SherlockFragmentActivity {

SessionManager sessionMngr ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    sessionMngr = new SessionManager(getApplicationContext());

    Toast.makeText(getApplicationContext(), "User Login Status: " + sessionMngr .isLoggedIn(), 
            Toast.LENGTH_LONG).show();
    sessionMngr.checkLogin();
            .
            .
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
super.onBackPressed();
}

嗨,在您的登錄屏幕中使用onBackpressed函數並實現此Intent函數。 它將帶您進入手機的主屏幕。

希望這會給您一些解決方案。

一個更簡單的解決方案應該是調用finish(); 在您的第二項活動中。

首先,不要在destroy()調用finish() ,該活動已經完成並消失了,而且還有其他所有問題。 您需要做的是在注銷時調用finish() ,無論您要注銷該人具有什么功能,都必須在其末尾添加finish()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM