当我们为程序设置密码后,当我们第一次进入该程序时就会提示我们输入密码,输入正确密码后就可以继续访问该程序,如果再次访问该程序就不会提示我们输入密码,这就是市面上常见程序锁的实现。
开发思路:
1. 开启服务,在服务中开启一个死循环,这个死循环用来检测当前访问的程序是不是被加锁的程序,如果是则弹出输入密码对话框。这里采用数据库来保存被加锁的程序。
2. 密码被保存在xml 中,如果匹配密码后则进入程序界面。
3.用一个boolean变量来防止多次进入同一个程序而导致显示密码对话框。
关键代码:
核心代码
public void onCreate() { //dao lockAppDao = new LockAppDao(getApplicationContext()); //从数据库获取到程序锁的集合 blockapppacks = lockAppDao.findAll(); //获取程序锁集合和程序锁当前状态是否已经打开 blockappinfos = new ArrayList<LockAppInfo>(); fillData(blockapppacks); // 得到activity的管理器 activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); intent = new Intent(this, EnterPasswordActivity.class); // 在新的任务栈中创建 activity的实例 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); new Thread() { @Override public void run() { // 看门狗, 不停的查看当前activity任务栈的栈顶 while (true) { // 首先获取到最上面的任务栈, get(0) 获取到任务栈栈顶的activity String packname = activityManager.getRunningTasks(1).get(0).topActivity .getPackageName(); for (LockAppInfo apppackinfo : blockappinfos) { if (packname.equals(apppackinfo.getPackname())) { //防止重复弹出密码对话框 if (!apppackinfo.isFlagcanstart()) { // 弹出密码对话框,弹出新的activity 覆盖当前要启动的activity intent.putExtra("packagename", packname); startActivity(intent); } } } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); super.onCreate(); } private void fillData(List<String> blockapppacks2) { for(String blockapp :blockapppacks2 ){ LockAppInfo info = new LockAppInfo(); info.setPackname(blockapp); info.setFlagcanstart(false); blockappinfos.add(info); } }
匹配密码