Как отключить кнопку "Недавние задачи/приложения"

Я создаю приложение для воспроизведения детей для Android. Мне нужно отключить все ключи, когда он используется. Я установил приложение в качестве домашнего приложения и отключил задний ключ (который заботится о кнопке "Домой" и "Назад" ). Чтобы очистить список недавних задач, я создал список Dummy Activites, которые запускаются, а затем завершаются, когда приложение запускается. Элементы Dummy Activites выглядят так:

public class Dummy1 extends Activity
{
  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
   finish();
}
}

И затем в моем onCreate приложения я выполняю:

this.pm.setComponentEnabledSetting(new ComponentName(this, Dummy1.class),   PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Intent localIntent1 = new Intent(this, Dummy1.class);
localIntent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(localIntent1); 

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

Теперь единственной кнопкой, которую я не могу отключить, является кнопка "Недавние задачи/приложения" (доступны в основном устройства HTC, т.е. один X, один S и т.д.). Кажется, что эта кнопка все еще поднимает все последние задачи (хотя мои фиктивные задачи были созданы), и я не могу найти "крючок" для события, которое запускается при нажатии этой кнопки?

Примечание. Я знаю, что это возможно, поскольку такие приложения, как ToddlerLock, сделали это... Я просто не могу понять это.

Ответ 1

Это закроет диалог RecentActivity. Поместите его в свой класс активности.

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if (!hasFocus) {
            windowCloseHandler.postDelayed(windowCloserRunnable, 250);
        }
    }

    private void toggleRecents() {
        Intent closeRecents = new Intent("com.android.systemui.recent.action.TOGGLE_RECENTS");
        closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        ComponentName recents = new ComponentName("com.android.systemui", "com.android.systemui.recent.RecentsActivity");
        closeRecents.setComponent(recents);
        this.startActivity(closeRecents);
    }

    private Handler windowCloseHandler = new Handler();
    private Runnable windowCloserRunnable = new Runnable() {
        @Override
        public void run() {
            ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
            ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

            if (cn != null && cn.getClassName().equals("com.android.systemui.recent.RecentsActivity")) {
                toggleRecents();
            }
        }
    }

В манифесте вам нужно будет сделать следующее разрешение.

    <uses-permission android:name="android.permission.GET_TASKS" />

Ответ 3

На самом деле вы не можете отключить кнопку задачи. Когда вы нажимаете его, ваша деятельность вызывает метод onPause(), и вы можете перенести свою задачу на фронт в этом методе. См. Мой ответ для соответствующего вопроса.

Ответ 4

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

Ответ 5

Вы можете отключить всплывающие окна StatusBar:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    try {
        if (!hasFocus) {
            Object service = getSystemService("statusbar");
            Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
            Method collapse = statusbarManager.getMethod("collapse");
            collapse.setAccessible(true);
            collapse.invoke(service);
        }
    } catch (Exception e) {
        Log.e(TAG, "onWindowFocusChanged - " + e.getCause());
    }
}

Также вы должны добавить это разрешение в AndroidManifest.xml

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

Надеюсь, что это поможет.