程序锁:
监视系统里面正在开启的应用程序,如果发现这个应用程序是需要输入密码的弹出密码输入界面,这就需要一个程序不停的监视系统里面正在运行的程序.
两个需求:
1.需要监视系统里面正在运行的程序
如果你让一个人去调研的话,最好每隔半天或者一天就让他汇报一个情况,碰到什么难点等
实现某一个功能可以从以下几个角度去考虑
1>.广播机制,比如发短信,打电话,这个是最简单的,我们只要创建一个广播接收者就行了,查看应用可以在<action android:name="查看广播,有没有我们要的广播事件";
2>.会不会系统暴露一个服务,aidl方式,要么通过getSystemService();
aidl可以查看framework.aidl这里列出来了所以通过aidl暴露出来的接口或者类去得到当前正在被打开的进程
用服务去得到
Activitymanger am = getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> runningtaskInfo = am.getRunningTasks(1);//返回一个正在运行的任务栈的集合信息,集合里面最多只有一个元素,这一个元素代表是最近即将要打开的任务
RunningTaskInfo taskinfo = runningtaskInfos.get(0);//获取第一个任务元素信息
taskinfo.topActivity拿到任务栈栈顶的任务,
taskinfo.topActivity.getPackageName()拿到应用程序的包名
因为不停的去监视程序所以要在线程的run()方法中while死循环.去获取当前的应用程序包名,还要让程序睡200毫秒否则一直在死循环会让cpu一直运转,而且也没有必要.获取当前应用程序是需要权限的android.permissionGET_TASKS
2.如果这个程序是我要保护的程序弹出密码输入界面(屏蔽后退键)
如果上面判断是我们要保护的包名,那么就开启一个activity
//屏蔽用户的后退键
用onKeyDown()方法,如果是按下的事件, 还要判断是后退键KeyEvent.KEYCODE_BACK,如果成立那么直接返回true,防止事件继续往下传递
上面程序有问题,如果进入应用程序后,因为是死循环所以判断这个程序又是要保护的就又弹出密码了. 如果用户密码输入正确,需要通知看门狗密码正确了,你可以暂时的停止对应用程序的保护了,这个实现可以使用一个广播事件发送一个广播,服务在接收这个广播后,定义一个暂时关闭的集合,如果判断包名在这个集合里就用continue;跳出当前的集合,不让他开启密码保护界面,在continue上面做一下延时,否则不断的continue也会消耗很多资源