自动阻止应用程序从启动器开始

时间:2011-03-02 14:57:38

标签: android launcher android-launcher

有一类Android应用程序可以在某些用户指定的应用程序上启用密码保护;例如,Android Protector。我需要从不同的方向解决这个问题。

是否可以创建阻止所有活动启动的应用程序,除非它们位于预定义的白名单中?这种方法会产生意想不到的后果吗?我熟悉Android基础知识并编写了一些相当简单的应用程序,但我仍在试图弄清楚这些“Protector”应用程序如何正确拦截启动意图。有人会介意给我一个关于正确方法的简要概述吗?

基本问题是我们有一个通用的Android手机,需要锁定,以便我们的客户(仅限内部)可以访问我们的自定义应用程序,而无法播放“极品飞车”等。我想删除运营商英国媒体报道,但生根设备似乎是一个维护头痛。我们希望每部手机的设置都像安装一些自定义应用程序一样简单。

3 个答案:

答案 0 :(得分:7)

编辑详细说明解决方案

<强>概述

我的简单解决方案是向我的应用程序添加新服务和活动。该服务使用HandlerpostDelayed来连续安排监控任务。监视任务检查当前活动是否在白名单中。获取当前正在运行的活动涉及ActivityManager以及对getRunningTasks的调用。完成检查后,监控任务会自行安排在X秒后再次运行(在我的情况下为1)。

如果顶部的活动不在白名单上,我们会启动阻止活动,该活动会弹出当前正在运行的任何内容。阻止活动的关键部分是它覆盖onBackPressed,阻止用户简单地返回“坏”活动。按住Home键是(据我所知)离开此屏幕的唯一方法。

<强>提示

  • 在锁定屏幕中构建后门。例如,我的解决方案在长按后退键时提示输入密码。输入正确的密码后,监视器服务将进入休眠状态5分钟,以便我可以进行管理工作
  • 显示已阻止活动的名称
  • 在打开之前收集一个好的白名单!您应该明确列入白名单的活动:启动器,软件包安装程序,您自己的应用程序(显然),浏览器,如果您的应用程序具有基于Web的组件

我不喜欢我的服务在后台不断循环;这似乎很浪费。我想找到一些方法在启动新任务时得到通知,但我找不到办法做到这一点。我的特定监听时间值和我的特定电话的电池使用情况是可以接受的;虽然你自己在采用它之前一定要测试。

答案 1 :(得分:4)

一个有效的解决方案,这是来自作者意见的代码

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;
}

答案 2 :(得分:0)

如你所知,编写自定义启动器可能会更干净;查看此开源启动器以获取参考http://code.google.com/p/adw-launcher-android/