程序锁:

监视系统里面正在开启的应用程序,如果发现这个应用程序是需要输入密码的弹出密码输入界面,这就需要一个程序不停的监视系统里面正在运行的程序.

两个需求:

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也会消耗很多资源