登陆界面对密码输入次数的控制,达到次数软件锁死或者提示用户过几分钟才能在输入的功能,现在的软件大多要求这样,
首先说一下整体的思路:
1.需要的类,①一个Application,②一个Activity(登陆界面),③一个Executors(计时器)
2.在application中的有两个变量①记录登陆界面的密码输入框是否被锁死的状态值(boolean flag),②记录密码错误到达指定次数时的当前时间(long currentTime), 八个方法:其中的四个方法是两个变量的set()get()方法,另外四个分别是:保存(flag和currentTime)到内存的方法和从内存获取(flag和currentTime)的方法;两个变量都在application中国的onCreate()方法中进行初始化,分别获取本地的值
3,在Activity的onCreate()方法中,调用application中的两个变量值的get方法获取到本地的值;并进行第一次判断,如果flag为true也就是密码输入框被锁,那么就执行一个判断本地时间和当前时间大小的方法;
flag为false就不用执行;
4.在登陆界面的密码输入到达指定次数时的操作:
①将设置输入框失去焦点,不可输入;
②调用application中的保存时间值和状态值的方法将当前时间加上一个你限制用户多少分钟后才能输入的时间和状态值为false保存到本地;
注:使用System.currentTimeMillis();
获得值单位是毫秒;
③开启一个线程;使用ExecutorsExecutors.newSingleThreadScheduledExecutor();
开启一个计时器来进行判断,每过几秒进行一个词判断时间是否到达;
④当时间到达指定时间值也就是从本地取得值和当前取得值一样就进行初始化状态值和输入框恢复焦点可输入状态;
详情代码:
创建一个类BaseApplication继承Application类
public class BaseApplication extends Application {
private static final String TAG = BaseApplication.class.getName();
private SharedPreferences sp1, sp2, sp3, sp4;
private boolean isLockPin = false;
private long lockPinTime;
@Override
public void onCreate() {
super.onCreate();
sp3 = getSharedPreferences(ConstanField.FILEUNLOCK, MODE_PRIVATE);
sp4 = getSharedPreferences(ConstanField.FILEOLDTIME, MODE_PRIVATE);
this.isLockPin = getLockPinFlag();
this.lockPinTime = getLockCertPinTime();
}
public void saveLockPinFlag(boolean flag) {
LogUtil.d(TAG, "saveLockPinFlag().");
SharedPreferences.Editor editor = sp3.edit().putBoolean(ConstanField.EXECUTLOCK, flag);
editor.commit();
}
public boolean getLockPinFlag() {
LogUtil.d(TAG, "getLockPinFlag().");
return sp3.getBoolean(ConstanField.EXECUTLOCK, false);
}
public long getLockPinTime() {
LogUtil.d(TAG, "getLockPinTime().");
return lockPinTime;
}
public void setLockPinTime(long lockPinTime) {
LogUtil.d(TAG, "setLockPinTime().");
this.lockPinTime = lockPinTime;
}
public void saveLockPinTime(long value) {
LogUtil.d(TAG, "saveLockPinTim().");
SharedPreferences.Editor editor = sp4.edit().putLong(ConstanField.CURENTTIME, value);
editor.commit();
}
public long getLockCertPinTime() {
LogUtil.d(TAG, "getLockCertPinTime().");
long aLong = sp4.getLong(ConstanField.CURENTTIME, 444);
return aLong;
}
}
在Activity中
public class LoadActivity extends Activity{
private BaseApplication app;
private static int count = 3;
private boolean unlock = false;
private long tryAgain = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (BaseApplication) getApplication();
unlock = app.getLockPinFlag();
long lockPinTime = app.getLockPinTime();
if (unlock) {
etpin.setFocusable(false);
myTread();
}
}
public void checkInputValue(){
boolean setPinFocusState = setPinFocusState();
if (!setPinFocusState) {
return;
}
if(你的密码错误){
--count;
showToast("pin码输入错误,你还剩" + count + "次输入机会");
}
}
public boolean setPinFocusState() {
LogUtil.d(TAG, "setPinFocusState().");
if (count <= 1) {
showToast("您今天的输入次数已用完");
etpin.setText("");
saveCurrentTime();
etpin.setFocusable(false);
return false;
}
etpin.setFocusable(true);
etpin.setFocusableInTouchMode(true);
etpin.requestFocus();
return true;
}
public void saveCurrentTime() {
long systemTime = getSystemTime() + 180 * 1000;
app.saveLockPinTime(systemTime);
app.saveLockPinFlag(true);
myTread();
}
public void myTread() {
LogUtil.e(TAG, "myThread().");
sched = Executors.newSingleThreadScheduledExecutor();
sched.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
han.sendEmptyMessage(START);
}
}, 10, 10, TimeUnit.SECONDS);
}
public long getSystemTime() {
LogUtil.d(TAG, "getSystemTime().");
long time = System.currentTimeMillis();
LogUtil.i(TAG, "time:" + time);
return time;
}
private Handler han = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == START) {
checkTimeLock();
}
etpin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showToast("Please ( " + tryAgain + " ) minutes try again.");
}
});
}
};
private void checkTimeLock() {
LogUtil.e(TAG, "checkTimeLock().");
long systemTime = getSystemTime();
long lockPinTime = app.getLockCertPinTime();
tryAgain = lockPinTime - systemTime;
LogUtil.i(TAG, "systemTime:" + systemTime + ",lockPinTime:" + lockPinTime + ",tryAgain:" + tryAgain);
if (systemTime == lockPinTime || lockPinTime - systemTime <= 0) {
etpin.setFocusable(true);
etpin.setFocusableInTouchMode(true);
etpin.requestFocus();
etpin.findFocus();
sched.shutdownNow();
count = 3;
tryAgain = 0;
app.saveLockPinFlag(false);
app.saveLockPinTime(0);
this.unlock = false;
}
}
}
这样不管你是切换界面还是退出程序都可以完成密码功能的实现;
其中的ConstanField是一个常量类;