Автоматическое запрещение приложений, начинающихся с запуска

Существует класс приложений для Android, которые обеспечивают защиту паролем в определенных пользовательских приложениях; например, Android Protector. Мне нужно подойти к этой проблеме с другого направления.

Можно ли создать приложение, которое блокирует все запуски активности, если они не находятся в предопределенном белом списке? Будут ли непредвиденные последствия с этим подходом? Я знаком с основами Android и написал несколько довольно простых приложений, но я все еще пытаюсь понять, как эти приложения "Protector" правильно перехватывают намерения запуска. Кто-нибудь подумает, давая мне краткий обзор правильного способа сделать это?

Основная проблема заключается в том, что у нас есть общий Android-телефон, который нужно заблокировать, чтобы наши клиенты (только внутренние) могли получить доступ к нашим пользовательским приложениям, не имея возможности играть "Need for Speed" и т.д. Я бы хотел удалите носитель вируса, но укоренение устройства похоже на то, что это будет головная боль обслуживания. Мы хотим, чтобы настройка для каждого телефона была такой же простой, как установка нескольких пользовательских приложений.

Ответы

Ответ 1

Отредактировано для разработки решения

Обзор

Мое простое решение заключалось в том, чтобы добавить новую услугу и действия в мое приложение. Служба использует Handler и postDelayed непрерывно планируйте задачу мониторинга. Задача мониторинга проверяет, что текущая активность находится в белом списке. Получение текущей активности включает ActivityManager и вызов getRunningTasks. По завершении проверки задача мониторинга планирует запустить снова через X секунд (1, в моем случае).

Если активность сверху не включена в белый список, мы запускаем активность блокировки, которая всплывает над тем, что в данный момент выполняется. Ключевой частью блокирующей активности является то, что она переопределяет onBackPressed, не позволяя пользователю просто вернуться к "плохой" активности. Нажатие клавиши "Домой" - единственный способ (насколько мне известно) выйти из этого экрана.

Советы

  • Создайте бэкдор на экране блокировки. Например, мое решение запрашивает пароль при длительном нажатии клавиши возврата. После ввода правильного пароля служба монитора переходит в спящий режим на 5 минут, поэтому я могу выполнять свою административную работу.
  • Отобразить имя заблокированной активности
  • Соберите хороший белый список, прежде чем включать это! Действия, которые вы должны определенно включить в белый список: пусковая установка, установщик пакетов, ваше собственное приложение (очевидно), браузер, если ваше приложение имеет веб-компонент

Мне не нравится, что мой сервис постоянно зацикливается на заднем плане; это кажется расточительным. Я хотел бы найти способ уведомления, когда запускается новая задача, но я не мог найти способ сделать это. Аккумулятор для моего конкретного значения периода мониторинга и моего телефона является приемлемым; хотя вам обязательно нужно проверить, прежде чем принимать это самостоятельно.

Ответ 2

эффективное решение, и вот код из авторского мнения

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

Ответ 3

Как вы полагаете, запись пользовательской пусковой установки, вероятно, будет более чистой; ознакомьтесь с этой пусковой установкой с открытым исходным кодом для справки http://code.google.com/p/adw-launcher-android/