我正在编写一个涉及登录详情(用户名和密码)的应用程序。
我希望当用户关闭应用程序并在以后重新启动时,不必再次输入用户名和密码。
我希望当用户关闭应用程序并在以后重新启动时,不必再次输入用户名和密码。
这是我的代码。不幸的是,它似乎无法记住密码和用户名:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPrefs = getSharedPreferences(PREFS, 0);
final CheckBox rememberMeCbx = (CheckBox)findViewById(R.id.saveLoginCheckBox);
boolean rememberMe = mPrefs.getBoolean("rememberMe", false);
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
mXmlRpcClient = new XMLRPCClient(mXmlRpcUri);
// Set up the login form.
//mUsername = getIntent().getStringExtra(EXTRA_EMAIL);
mUsernameView = (EditText) findViewById(R.id.username);
mUsernameView.setText(mUsername);
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id,
KeyEvent keyEvent) {
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
mLoginFormView = findViewById(R.id.login_form);
mLoginStatusView = findViewById(R.id.login_status);
mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
findViewById(R.id.sign_in_button).setOnClickListener
(
new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if(rememberMeCbx.isChecked())
{
attemptLogin(); //function to check if fields are filled correctly
saveLoginDetails();
}
else
{
attemptLogin();
removeLoginDetails();
}
}
});
if(rememberMe == true)
{
//get previously stored login details
String login = mPrefs.getString("mUsername", null);
String upass = mPrefs.getString("mPassword", null);
if(login != null && upass != null)
{
//fill input boxes with stored login and pass
EditText loginEbx = (EditText)findViewById(R.id.username);
EditText passEbx = (EditText)findViewById(R.id.password);
loginEbx.setText(login);
passEbx.setText(upass);
//set the check box to 'checked'
rememberMeCbx.setChecked(true);
}
}
}
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
mSessionID = (String)mXmlRpcClient.call(mLoginFuncName, mUsername, mPassword);
return true;
} catch (Exception e) {
return false;
}
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
finish();
Intent intent = new Intent(LoginActivity.this, MainWindow.class);
intent.putExtra("SessionID", mSessionID);
intent.putExtra("XmlRpcUrl", mXmlRpcUrl);
intent.putExtra("LoginFuncName", mLoginFuncName);
intent.putExtra("LogoutFuncName", mLogoutFuncName);
intent.putExtra("GetDevicesFuncName", mGetDevicesFuncName);
intent.putExtra("SendPositionFuncName", mSendPositionFuncName);
intent.putExtra("GetSavedTripFunc", mGetSavedTripFunc);
startActivity(intent);
} else {
mPasswordView
.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
}
private void saveLoginDetails()
{
//fill input boxes with stored login and pass
EditText loginEbx = (EditText)findViewById(R.id.username);
EditText passEbx = (EditText)findViewById(R.id.password);
String login = loginEbx.getText().toString();
String upass = passEbx.getText().toString();
Editor e = mPrefs.edit();
e.putBoolean("rememberMe", true);
e.putString("login", login);
e.putString("password", upass);
e.commit();
}
private void removeLoginDetails()
{
Editor e = mPrefs.edit();
e.putBoolean("rememberMe", false);
e.remove("login");
e.remove("password");
e.commit();
}
请问,我代码有什么问题?我该如何改进它,以便在应用程序关闭并再次打开后保存和检索用户名和密码?
onPause()
中保存Preference
中的数据,并在活动onResume()
中加载该数据。 - M D