解决的问题:
我们在开发Android app的登录功能时,为了加强app的安全性,很有必要实现这样一种功能,即多次登录认证失败,app锁定,直到一定时间之后才能够允许用户重新认证登录。姑且叫它登录锁吧。
这样的登录锁功能实现基于两个关键点:
1.System.currentTimeMillis()方法用于获取Java虚拟机的当前运行时刻。
2.SharedPreferences的使用,用于保存若干次登录失败时的Java虚拟机当前运行时刻。
下面是核心代码:
package com.example.leidong.timertest;
import android.content.Intent;
import android.content.SharedPreferences;
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.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//用于显示正确的密码
private TextView textView;
//用于输入用户的密码
private EditText editText;
//跳转按钮,认证成功则完成跳转功能
private Button button;
//3次登录机会
private int LOGIN_CHANCES = 3;
//还剩几次登录机会的标志,初始值就是LOGIN_CHANCES
private int count = LOGIN_CHANCES;
//多次认证失败时需要等待的时间
private float WAIT_TIME = 30000L;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载MainActivity的布局
setContentView(R.layout.activity_main);
//获取组件
init();
//按钮点击事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//拿到输入框中的输入内容
String password = editText.getText().toString().trim();
SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
//输入错误时的时间,如果为空的话就取0L
long errorTime = sp.getLong("errorTime", 0L);
//获取当前时间
long recentTime = System.currentTimeMillis();
//如果当前时间与出错时间相差超过30s
if(recentTime - errorTime > WAIT_TIME) {
//认证成功,密码假设就是123456
if (password.equals(textView.getText().toString().trim())) {
//认证成功,跳转到欢迎界面
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
//跳转到OtherActivity
startActivity(intent);
//跳转的同时结束MainActivity
finish();
}
//认证失败
else {
//如果LOGIN_CHANCES次认证全部失败
if(count == 1) {
//清除输入框内容
editText.setText("");
//count值重置
count = LOGIN_CHANCES;
//Toast提醒
Toast.makeText(MainActivity.this, "连续" + LOGIN_CHANCES + "次认证失败,请您" + WAIT_TIME / 1000 +"秒后再登陆!", Toast.LENGTH_LONG).show();
//LOGIN_CHANCES次登录失败时,获取此时的Java虚拟机运行时刻并保存提交
errorTime = System.currentTimeMillis();
SharedPreferences sp1 = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = sp1.edit();
editor.putLong("errorTime", errorTime);
editor.commit();
}
//LOGIN_CHANCES次登录机会未用完
else{
//清除输入框内容
editText.setText("");
//剩余次数减1
count--;
//Toast提醒
Toast.makeText(MainActivity.this, "您还有" + count + "次登录机会!", Toast.LENGTH_LONG).show();
}
}
}
//LOGIN_CHANCES次登录机会全部用完,app锁定WAIT_TIME时间,在此期间登录无效,锁定
else{
//Toast提醒
Toast.makeText(MainActivity.this, "登录界面锁定中,请等待!", Toast.LENGTH_LONG).show();
}
}
});
}
/**
* 获取组件
*/
private void init() {
textView = (TextView)findViewById(R.id.textView);
editText = (EditText)findViewById(R.id.editText);
button = (Button)findViewById(R.id.button);
}
}
运行结果:
1.三次输入故意输入错误密码
2.第3次输入错误密码时
3.在等待期间输入,即使密码正确也不能够登陆,必须等到30s后才能登陆
4.等待时间过后输入正确的密码,成功跳转到欢迎界面
/****************************************************************/
源码地址:
http://download.csdn.net/detail/ldld1717/9662467
/****************************************************************/