2011-03-02 242 views
15

有一類Android應用程序可以在某些用戶指定的應用程序上啓用密碼保護;例如,Android Protector。我需要從不同的方向來解決這個問題。自動阻止應用程序從啓動程序啓動

是否可以創建阻止所有活動啓動的應用程序,除非它們位於預定義的白名單中?這種方法會有意想不到的後果嗎?我熟悉Android基礎知識並撰寫了一些相當簡單的應用程序,但我仍在試圖弄清楚這些「Protector」應用程序如何正確攔截啓動意圖。有人會介紹給我一個簡單的概述,瞭解這樣做的正確方法嗎?

基本問題是我們有一個需要鎖定的通用Android手機,這樣我們的客戶端(僅限內部)才能訪問我們的自定義應用程序,而無法播放「極品飛車」等。我希望去除載體英國媒體報道,但生根器似乎是一個維護頭痛。我們希望每部手機的設置都像安裝一些自定義應用程序一樣簡單。

+1

我只想補充一點,這款手機和相關應用程序將永遠不會向公衆發佈的代碼;它只是內部的。如果有人有一個外面的答案,我也會很感激。 – WorkerThread 2011-03-02 15:00:59

+1

好問題。我很好奇自己。 – 2011-03-02 15:05:06

+0

如何編寫自定義啓動器只顯示允許的應用程序? (您需要鎖定Android電子市場,因爲用戶可以從市場內開始安裝應用程序) – TomTasche 2011-03-02 16:02:46

回答

7

編輯,以闡述該解決方案

概述

我簡單的解決方案是一種新的服務和活動添加到我的應用程序。該服務使用HandlerpostDelayed來連續調度監控任務。監控任務檢查當前活動是否在白名單上。獲取當前正在運行的活動涉及ActivityManager和致電getRunningTasks。完成檢查後,監視任務安排自己在X秒後再次運行(在我的情況中爲1)。

如果頂部的活動不在白名單上,我們將啓動阻止活動,該活動會彈出當前正在運行的任何活動。阻止活動的關鍵部分是重寫onBackPressed,防止用戶簡單地回到「不良」活動。按Home鍵是唯一的方法(據我所知)離開這個屏幕。

提示

  • 建立一個後門爲鎖屏。例如,我的解決方案在長按後退鍵時會提示輸入密碼。輸入正確的密碼後,顯示器服務將進入睡眠狀態5分鐘,以便我可以執行我的管理工作
  • 顯示被阻止的活動的名稱
  • 在開啓此功能之前收集好的白名單!您應該明確白名單的活動:發射器,包安裝程序,您自己的應用程序(顯然),瀏覽器,如果您的應用程序有一個基於Web的組件

我不喜歡我的服務不斷循環背景;這似乎是浪費。我想找到某種方式在新任務啓動時得到通知,但我找不到這樣做的方法。對於我特定的監視時間段和我的特定電話的電池使用情況是可以接受的;儘管你自己應該在測試之前進行測試。

+0

我對這種方法很感興趣。你介意發佈代碼嗎?你有沒有遇到過這種技術的問題? – 2011-06-20 20:01:57

+0

@WorkerThread非常有趣!本月我們收到400美元的數據賬單後,我真的正在爲我們的客戶研究它:)你有沒有想出更好的解決方案?也許某種系統服務攔截髮射器事件? – katit 2011-11-12 02:16:05

4

的efective的解決方案,並在這裏是從作者的觀點

public class MonitorService extends Service { 

private Handler handler; 
Runnable runnable; 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    handler = new Handler(); 
    runnable = new Runnable() { 
     @Override 
     public void run() { 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 

        List<ActivityManager.RunningTaskInfo> taskInfo = am 
          .getRunningTasks(1); 

        ComponentName componentInfo = taskInfo.get(0).topActivity;      
        String currentActivityName=componentInfo.getClassName(); 
        String packageName=componentInfo.getPackageName(); 
        if(whitelist.contains(currentActivityName)){ 

         Intent launchIntent = new Intent(); 
         launchIntent.setComponent(new ComponentName(blockActivityPackageName, 
           blockActivityName)); 
         launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(launchIntent); 

        } 

       } 
      }).start(); 
      handler.postDelayed(this, 1000); 
     } 
    }; 
    handler.postDelayed(runnable, 1000); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Intent intent = new Intent(this, MonitorService.class); 
    startService(intent); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
}