我在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 :(得分: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功能并实现此 Intent 功能。它将带您进入手机的主屏幕。
希望这会给你一些解决方案。
答案 1 :(得分:0)
更简单的解决方案应该是在第二个活动中调用finish();
。
答案 2 :(得分:0)
首先不要在finish()
中调用destroy()
,活动已经完成并且已经消失,再加上其他所有内容。你需要做的是在退出时调用finish()
,无论你有什么功能来记录这个人,最后都要放finish()
。