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

有一类Android应用程序可以在某些用户指定的应用程序上启用密码保护;例如,Android Protector。我需要从不同的方向解决这个问题。 是否可以创建阻止所有活动启动的应用程序,除非它们位于预定义的白名单中?这种方法会产生意想不到的后果吗?我熟悉Android基础知识并编写了一些相当简单的应用程序,但我仍在试图弄清楚这些“Protector”应用程序如何正确拦截启动意图。有人会介意给我一个关于正确方法的简要概述吗? 基本问题是我们有一个通用的Android手机,需要锁定,以便我们的客户(仅限内部)可以访问我们的自定义应用程序,而无法播放“极品飞车”等。我想删除运营商臃肿软件,但生根设备似乎是一个维护头痛。我们希望每部手机的设置都像安装一些自定义应用程序一样简单。     
已邀请:
编辑精心制作解决方案 概观 我的简单解决方案是向我的应用程序添加新服务和活动。该服务使用
Handler
postDelayed
连续安排监控任务。监视任务检查当前活动是否在白名单中。获取当前正在运行的活动涉及
ActivityManager
和呼叫
getRunningTasks
。完成检查后,监视任务会在X秒后调度自己再次运行(在我的情况下为1)。 如果顶部的活动不在白名单上,我们会启动阻止活动,该活动会弹出当前正在运行的任何内容。阻止活动的关键部分是它覆盖
onBackPressed
,阻止用户简单地回到“坏”活动。按Home键是(据我所知)离开此屏幕的唯一方法。 提示 在锁定屏幕中构建一个后门。例如,我的解决方案在长按后退键时提示输入密码。输入正确的密码后,监视器服务进入睡眠状态5分钟,这样我就可以进行管理工作了 显示被阻止活动的名称 在打开之前收集一个好的白名单!您应该明确列入白名单的活动:启动器,软件包安装程序,您自己的应用程序(显然),浏览器,如果您的应用程序具有基于Web的组件 我不喜欢我的服务在后台不断循环;这似乎很浪费。我想找到一些方法在启动新任务时得到通知,但我找不到办法做到这一点。我的特定监听时间值和我的特定电话的电池使用情况是可以接受的;虽然你自己在采用它之前一定要测试。     
一个有效的解决方案,这是来自作者意见的代码
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;
}
    
正如你的建议,写一个自定义发射器可能会更清洁;查看此开源启动器以供参考http://code.google.com/p/adw-launcher-android/     

要回复问题请先登录注册