@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //咱們將經過activity管理服務得到當前activity棧的內容 final ActivityManager am=(ActivityManager)getSystemService(ACTIVITY_SERVICE); //這個intent能夠寫死,由於一直都是轉向這個 final Intent mintent=new Intent(); //flag必須是new task,仔細想一想service與activity的區別就明白了。 mintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //這個不用說了 mintent.setClass(getApplicationContext(),LockActivity.class); //一個線程,讓我一直檢測 AsyncTask taskWatcher=new AsyncTask() { @Override protected Object doInBackground(Object... params) { //把這個while當成看門狗吧。 while(true){ /**咱們只須要得到1個RunningTasks,通常狀況下,會從棧頂按照傳入的個數來獲取 一個集合,總有一個activity的,不會報空的請放心 */ String name=am.getRunningTasks(1).get(0).topActivity.getPackageName(); /**判斷當前activity的包是不是屬於受保護的 固然,實際狀況下是讀取數據什麼的,獲取一個集合 這個集合一般是提早列出系統全部安裝的apk包,並讓用戶選擇所獲得的 */ if(pakageName.equals(name)){ /**轉向目標意圖,本身制定 * 能夠列個輸入框輸密碼什麼的。 * * 在目標activity,要屏蔽返回鍵,由於返回上一個task的棧頂,則 * 又會返回到這裏,寫代碼又要跑一邊,無心義,若是如輸入密碼對了 * 則finish驗證activity,會自動返回到用戶指望的activity。 * * 驗證的策略,與經過驗證的實效期,按照本身的需求來制定即刻 */ startActivity(mintent); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; taskWatcher.execute(null); }