-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

相关问题