当我们为程序设置密码后,当我们第一次进入该程序时就会提示我们输入密码,输入正确密码后就可以继续访问该程序,如果再次访问该程序就不会提示我们输入密码,这就是市面上常见程序锁的实现。
开发思路:
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);
- }
- }
匹配密码
- public void entry(View view){
- System.out.println("123");
- String password = et_password.getText().toString();
- String pwd = sp.getString("lock_app_pwd", "");
- Intent intent = getIntent();
- if (password.equals(pwd)){
- if(intent!=null){
- String packname = intent.getStringExtra("packagename");
- Log.i(TAG,packname);
- iLockService.stopLockAppFlag(packname);
- }
- finish();
- }
- }
输入密码时屏蔽后退键
- // 屏蔽用户按后退键
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }