android登陆界面限制密码输入次数,退出程序也会记住密码输入次数
来源:互联网 发布:淘宝抢购神器 编辑:程序博客网 时间:2024/05/16 23:50
登陆界面对密码输入次数的控制,达到次数软件锁死或者提示用户过几分钟才能在输入的功能,现在的软件大多要求这样,
首先说一下整体的思路:
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是一个常量类;
- android登陆界面限制密码输入次数,退出程序也会记住密码输入次数
- 用户输入密码次数的限制笔记
- CAS通过用户名与ip限制密码输入错误次数
- 登陆界面记住密码
- Ubuntu循环登陆,输入密码不管也
- 限制输入次数的系统登陆的实现
- Ubuntu: 登陆界面无法输入密码
- [Linux] Ubuntu: 登陆界面无法输入密码
- ubuntu 登陆界面无法输入密码
- android登陆记住密码
- 登陆界面 记住密码功能
- 登陆界面的密码记住
- oracle 限制用户密码输入错误次数及限制用户每隔一段时间修改密码以确保数据库安全
- oracle 限制用户密码输入错误次数及限制用户每隔一段时间修改密码以确保数据库安全
- Android-登陆界面,包含记住密码和自动登陆
- [转]Oracle11g 输入错误次数修改、用户解锁、密码过期
- Oracle 输入错误次数修改、用户解锁、密码过期
- ubuntu登陆输入密码后返回到登陆界面
- 远程管理:teamviewer,ssh,x11vnc,vncviewer
- iOS:OC的定时器任务方法,延时方法
- Android的ADT与SDK的区别
- Linux上的大文件如何读取
- AS问题解决系列1—iCCP: Not recognizing known sRGB profile
- android登陆界面限制密码输入次数,退出程序也会记住密码输入次数
- 通信
- C语言文件操作函数大全
- UIStackView
- MySql jdbc URL 参数及编码说明
- Git创建提交命令
- 减治算法之寻找两个递增序列的中位数
- Servlet中转发和重定向的路径问题以及表单提交路径问题
- 读取短信验证码并自动设置给文本框