2011-03-02 275 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; 
}