Не удается отключить кнопку Home на определенных устройствах Android
Я знаю, что этот вопрос задавался много раз, и ответ всегда был: "Нет, мы не можем отключить кнопку" Домой "".
У меня есть немного другой запрос, чтобы спросить.
Я написал простой код, в котором моя деятельность переопределяет onKeyDown() и возвращает true для всех нажатий клавиш.
Теоретически это означает, что тот, кто открывает приложение, застревает там и не имеет возможности выйти из приложения.
Когда я тестировал это приложение на разных устройствах, я сделал следующие наблюдения:
- На устройстве Motorola с ОС как 2.2.2 кнопка Home отключена.
- На устройстве HTC с ОС 2.3.5 кнопка "Домой" отключена.
- На Sony с ОС 2.3.7 кнопка "Домой" отключена.
- На Samsung с ОС как 2.2.1 и 2.3.3 кнопка "Домой" была отключена.
- На Samsung с ОС 2.3.6 и 4.0.4 кнопка "Домой" оставалась включенной.
Эти наблюдения кажутся очень противоречивыми.
Есть ли у кого-нибудь идеи, почему разные устройства ведут себя по-разному и как лучше всего справиться с таким сценарием.
Насколько я понимаю, до сих пор ни один из производителей не настраивал ОС Android. Все помещают туда слой пользовательского интерфейса, но никто не трогал внутренности.
3 ответа
Как уже упоминалось в моем вопросе для устройств ниже 2.3.6 переопределение ОС keypress()
функции работают хорошо.
Выпуск начинается с 2.3.6 года. Я не знаю, что сделали эти производители устройств, но keypress()
Функция не работает одинаково на всех устройствах.
Также с ICS и далее Google прекратил использовать keypress()
функционировать раз и навсегда
Так как мы это делаем.
На мой взгляд, если мы пытаемся переопределить кнопку "Домой", это невозможно, но определенно мы можем ее прослушать.
В нашем манифесте Android мы используем <category android:name="android.intent.category.HOME" />
Фильтр, чем это делает нашу деятельность в качестве домашнего экрана замены. Теперь, когда вы нажмете кнопку "Домой", всегда будет появляться всплывающее окно разрешения проблем и спрашивать, какое приложение, то есть программа запуска по умолчанию или ваше приложение, должно реагировать на нажатие кнопки "Домой". Вы всегда можете выбрать приложение там.
Но это не отменяет и не отключает кнопку домой. всякий раз, когда вы нажимаете кнопку "Домой", одно и то же повторяется снова и снова до тех пор, пока вы не установите приложение по умолчанию, установив флажок "Использовать по умолчанию" во всплывающем окне.
Теперь, когда вы выбрали приложение в качестве домашней страницы по умолчанию, приложение всегда будет запускаться.
Готово... нет. Известно, что если вы выходите из приложения, кнопка "Домой" все равно запускает ваше приложение. Как избавиться от этого, как только ваша работа сделана.
Что нам нужно сделать, это закрыть или вызвать метод finish() для нашей активности, перед этим мы должны установить значение пакета по умолчанию, используя:
paramPackageManager1.setComponentEnabledSetting(localComponentName2, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 1);
Это будет связывать кнопку домой с вашей деятельностью.
Я знаю, что этот вопрос задавался много раз, и ответ всегда был: "Нет, мы не можем отключить кнопку" Домой "".
Если вы хотите обработать кнопку HOME, создайте домашний экран.
Есть ли у кого-нибудь идеи, почему разные устройства ведут себя по-разному?
Потому что это разные устройства, а вендоры внесли изменения. Кроме того, в случае 4.0.4 могут быть добавлены дополнительные средства защиты, чтобы помочь авторам вредоносных программ не захватывать кнопку HOME, не будучи домашним экраном.
Каков наилучший способ справиться с таким сценарием?
Если вы хотите обработать кнопку HOME, создайте домашний экран.
Все помещают туда слой пользовательского интерфейса, но никто не трогал внутренности.
Это неверно Практически каждый производитель устройств в той или иной степени "прикоснулся к внутренностям". Пока они соответствуют требованиям совместимости для Play Store, их изменения считаются приемлемыми для Google.
Вы можете попробовать это:
@Override
public void onBackPressed() {
}
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
((ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)).moveTaskToFront(getTaskId(), 0);
}
@Override
protected void onPause() {
super.onPause();
((ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)).moveTaskToFront(getTaskId(), 0);
}
Необходимые разрешения - добавьте следующее в манифест
<uses-permission android:name="android.permission.REORDER_TASKS" />