当我们为程序设置密码后,当我们第一次进入该程序时就会提示我们输入密码,输入正确密码后就可以继续访问该程序,如果再次访问该程序就不会提示我们输入密码,这就是市面上常见程序锁的实现。
开发思路:
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);
}