2013-04-18 174 views
2

我正在開發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(); 
      . 
      . 
+0

你可以發佈應用程序崩潰的代碼(在'onDestroy()') –

+0

也發佈你的清單。 –

回答

0
@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功能和實現這個意圖功能。它會帶你到手機的主屏幕。

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

0

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

+0

我完成了關於destroy函數的活動。當我按下後退按鈕時,我遇到了類似「java.lang.runtimeException無法銷燬活動」的異常。 –

+0

@SwapnilTayade當調用onDestroy()時,活動已經完成。您當時不應該調用'finish()'。發佈你的'onDestroy()'的代碼 –

0

首先不要撥打finish()destroy(),活動已經完成並離開,再加上一切與其他。你需要做的是在註銷時調用finish(),無論你有什麼功能登出人員,在最後登錄finish()

+0

所以它的工作? – LuckyMe