-2

我在android中還是個新手。我已經創建了Android用戶可以登錄到應用程序的登錄應用程序。用戶成功登錄後,直接進入首頁活動。我的偏好值(我使用電子郵件作爲字符串值)保存得很好,我的註銷按鈕也能正常工作。我嘗試按下我的Android設備模擬器中的主頁按鈕,然後再次運行應用程序,它運行良好。該應用程序可以在顯示電子郵件的「家庭」活動中恢復我的偏好值。我的問題是,當我按下設備模擬器中的返回按鈕時,應用程序關閉,我嘗試再次打開我的應用程序,顯示主頁活動但未加載我的首選項值字符串(電子郵件),而不顯示最後登錄的用戶的電子郵件。你能告訴我爲什麼嗎?如何在用戶登錄到應用程序後保留我的偏好值(電子郵件字符串)?重新打開應用程序時,爲什麼我的SharedPreferences字符串值爲登錄null?

這裏是我的代碼: SessionManager.java

package com.agungphe.simplelogreg; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 

import java.util.HashMap; 

public class SessionManager extends Activity { 
    // Shared Preferences 
    SharedPreferences pref; 

    // Editor for Shared preferences 
    SharedPreferences.Editor editor; 

    // Context 
    Context _context; 

    // Shared pref mode 
    int PRIVATE_MODE = 0; 

    // Sharedpref file name 
    private static final String PREF_NAME = "PirjaRSMS"; 

    // All Shared Preferences Keys 
    private static final String IS_LOGIN = "IsLoggedIn"; 

    // Email address (make variable public to access from outside) 
    public static final String KEY_EMAIL = "email"; 

    // Constructor 
    public SessionManager(Context context){ 
     this._context = context; 
     pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
     editor = pref.edit(); 
    } 

    /** 
    * Create login session 
    * 
    * @param email*/ 
    public void createLoginSession(String email){ 
     // Storing login value as TRUE 
     editor.putBoolean(IS_LOGIN, true); 

     // Storing email in pref 
     editor.putString(KEY_EMAIL, email); 

     // commit changes 
     editor.commit(); 
    } 

    /** 
    * Check login method wil check user login status 
    * If false it will redirect user to login page 
    * Else won't do anything 
    * */ 
    public void checkLogin(){ 
     // Check login status 
     if(!this.isLoggedIn()){ 
      // user is not logged in redirect him to Login Activity 
      Intent i = new Intent(_context, Login.class); 
      // Closing all the Activities 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

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

      // Staring Login Activity 
      _context.startActivity(i); 
      finish(); 
     } 

    } 

    /** 
    * Get stored session data 
    * */ 
    public HashMap<String, String> getUserDetails(){ 
     HashMap<String, String> user = new HashMap<String, String>(); 

     // user email id 
     user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); 

     // return user 
     return user; 
    } 

    /** 
    * Clear session details 
    * */ 
    public void logoutUser(){ 
     // Clearing all data from Shared Preferences 
     editor.clear(); 
     editor.commit(); 

     // After logout redirect user to Loing Activity 
     Intent i = new Intent(_context, Login.class); 
     // Closing all the Activities 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

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

     // Staring Login Activity 
     _context.startActivity(i); 
    } 

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

Login.java

package com.agungphe.simplelogreg; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.android.volley.AuthFailureError; 
import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 

import java.util.HashMap; 
import java.util.Map; 

public class Login extends AppCompatActivity implements View.OnClickListener { 

    public static final String LOGIN_URL = "http://182.168.6.77/api_pirja/login.php"; 

    public static final String KEY_EMAIL="email"; 
    public static final String KEY_PASSWORD="password"; 

    private EditText editTextEmail; 
    private EditText editTextPassword; 
    private Button buttonLogin; 

    private String email; 
    private String password; 

    // Session Manager Class 
    SessionManager session; 

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

     // Session Manager 
     session = new SessionManager(getApplicationContext()); 

     if(session.isLoggedIn() == true){ 
      setContentView(R.layout.activity_home); 
     } 
     else { 
      setContentView(R.layout.activity_login); 

      editTextEmail = (EditText) findViewById(R.id.editTextEmail); 
      editTextPassword = (EditText) findViewById(R.id.editTextPassword); 

//   Toast.makeText(getApplicationContext(), "User Login Status: " + session.isLoggedIn(), Toast.LENGTH_LONG).show(); 

      buttonLogin = (Button) findViewById(R.id.button); 

      buttonLogin.setOnClickListener(this); 
     } 
    } 


    private void userLogin() { 
     email = editTextEmail.getText().toString().trim(); 
     password = editTextPassword.getText().toString().trim(); 

     StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         if(response.trim().equals("success")){ 
          session.createLoginSession(email); 
          openHome(); 
         } 
         else if(response.trim().equals("blm_aktif")){ 
          openVerifikasi(); 
         } 
         else{ 
          Toast.makeText(Login.this,response,Toast.LENGTH_LONG).show(); 
         } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(Login.this,error.toString(),Toast.LENGTH_LONG).show(); 
        } 
       }){ 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String,String> map = new HashMap<String,String>(); 
       map.put(KEY_EMAIL,email); 
       map.put(KEY_PASSWORD,password); 
       return map; 
      } 
     }; 

     RequestQueue requestQueue = Volley.newRequestQueue(this); 
     requestQueue.add(stringRequest); 
    } 

    private void openHome(){ 
     Intent intent = new Intent(this, Home.class); 
     startActivity(intent); 
     finish(); 
    } 

    private void openVerifikasi(){ 
     Intent intent = new Intent(this, Verifikasi.class); 
     startActivity(intent); 
     finish(); 
    } 

    @Override 
    public void onClick(View v) { 
     userLogin(); 
    } 

    public void keRegister(View view){ 
     Intent intent = new Intent(this, Register.class); 
     startActivity(intent); 
    } 
} 

Home.java

package com.agungphe.simplelogreg; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.util.HashMap; 

public class Home extends AppCompatActivity { 

    // Session Manager Class 
    SessionManager session; 

    // Button Logout 
    Button btnLogout; 

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

     // Session class instance 
     session = new SessionManager(getApplicationContext()); 

     session.checkLogin(); 

     // get user data from session 
     HashMap<String, String> user = session.getUserDetails(); 

     // email 
     String email = user.get(SessionManager.KEY_EMAIL); 

     setContentView(R.layout.activity_home); 

     TextView lblEmail = (TextView) findViewById(R.id.lblEmail); 

     // Button logout 
     btnLogout = (Button) findViewById(R.id.btnLogout); 

     // displaying user data 
     lblEmail.setText(email); 

    } 

    public void logOut(View view){ 
     session.logoutUser(); 
     finish(); 
    } 
} 

感謝提前:)

+0

上的活動您按後退按鈕@Agung? – Radhey

回答

-1

從活動的Android的生命週期來看,

enter image description here

您是否實施將OnPause和方法的onResume?由於按下後退按鈕不會關閉活動,但它會進入暫停狀態。在onResume中執行setText可以解決您的問題。

這是你的onResume:

@Override 
public void onResume() { 
    super.onResume(); // Always call the superclass method first 

    // You'll have to run the code to retrieve your user details, and set all of them to their relative widgets. 
} 
+0

哪裏可以放上onPause和onResume方法?你給我舉個例子嗎?感謝您的幫助 – Agung

+0

@Agung https://developer.android.com/training/basics/activity-lifecycle/pausing.html將它放在您的活動中 – Nicholas

+0

是的,我已閱讀該頁面,但我仍然對什麼感到困惑我應該在onPause和onResume中做什麼。例如,我想在關閉時保留我的pref(字符串電子郵件)(也許它被稱爲暫停)。那麼如何在onResume中實現呢?在頁面示例中是: if(mCamera!= null)mCamera.release(); mCamera = null; } 什麼是mCamera和release()? – Agung

相關問題