Андроидная перехват последних приложений
У меня есть приложение, предназначенное для детей, и я не хочу, чтобы они могли нажимать кнопку "Недавние приложения" (ту, которая выглядит как два прямоугольника друг над другом). Я забочусь о том, чтобы захватить кнопку "Назад" и кнопку "Домой", и я много искал и много читал о попытке захватить кнопку "Недавние приложения" , но, по большому счету, вы не можете или так, как они это делают, очень сомнительно.
В приложении "Kids Place" появляется сообщение "Действие не разрешено" и перенаправляет вас на главный экран, если вы нажмете кнопку "Недавние приложения" , это работает, даже если вы находитесь в другом приложении, так как они делая это?
Любые предложения, подсказки будут оценены.
Спасибо.
Ответы
Ответ 1
После многого поиска и кодирования текущее лучшее решение, которое я нашел, выглядит следующим образом:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!hasFocus) {
windowCloseHandler.postDelayed(windowCloserRunnable, 0);
}
}
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" />
При использовании этого подхода, когда пользователь нажимает кнопку последних приложений, это приведет к тому, что ваша деятельность будет проходить через жизненный цикл активности следующим образом: onPause → onWindowFocusChanged → onResume.
Для пользователя появляется поведение, что нажатие кнопки последних приложений не отвечает. ПРИМЕЧАНИЕ. Я обнаружил, что если вы нажмете кнопку последних приложений быстро, она отобразит это представление на короткое время.
Это не лучшее решение, но это удар. Если у вас есть лучшее решение, поделитесь им.
Ответ 2
Лучший способ, который я нашел, - это сделать:
public class BaseActivity extends Activity {
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.d("Focus debug", "Focus changed !");
if(!hasFocus) {
Log.d("Focus debug", "Lost focus !");
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
sendBroadcast(closeDialog);
}
}
}// all credit goes here: http://www.juliencavandoli.com/how-to-disable-recent-apps-dialog-on-long-press-home-button/
Это не мой собственный код, но это просто скрывает список последних приложений.
Ответ 3
спасибо esse для решения для более высокого SDK! Я пропустил это.
Но в моем случае мне нужно дублировать вызов (или эффект нестабилен)
if (SDK>15){
windowCloseHandler.postDelayed(windowCloserRunnable, 10);
windowCloseHandler.postDelayed(windowCloserRunnable, 300);
}
Ответ 4
Если вы заинтересованы в отключении всех системных кнопок, возможно, это будет полное уничтожение системной панели, см. Легкий способ скрыть системную панель на Android ICS
Ответ 5
В принятом ответе вы используете ClassName только для Android 4.2 - 4.4. Он не будет работать на 5.0 и выше, или на Android 4.1.
Вот список ClassNames для основных версий Android:
- Android 4.1: "com.android.internal.policy.impl.RecentApplicationsDialog"
- Android 4.2 - 4.4: "com.android.systemui.recent.RecentsActivity"
- Android 5.0 - 7.1: "com.android.systemui.recents.RecentsActivity" (добавлено письмо "s" )
Лучшим решением для вас будет использование Accessibility Service.
Переопределите метод onAccessibilityEvent()
, отфильтруйте перечисленные выше ClassNames и выполните что-то, когда вы обнаружите это событие. Например, имитируйте нажатие кнопки "Главная". Вы можете сделать это, сделав глобальное действие в службе специальных возможностей.