程序鎖:
監視系統裏面正在開啓的應用程序,如果發現這個應用程序是需要輸入密碼的彈出密碼輸入界面,這就需要一個程序不停的監視系統裏面正在運行的程序.
兩個需求:
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也會消耗很多資源