无法禁用特定Android设备上的主页按钮

时间:2012-04-27 11:21:38

标签: android android-homebutton

我知道这个问题已被多次询问,答案总是“我们不能禁用主页按钮”。

我有一个不同的询问要求。

我编写了简单的代码,其中我的活动会覆盖onKeyDown()并为所有按键返回true。

理论上,这意味着无论谁打开应用程序都会被卡在那里,并且无法退出应用程序。

当我在不同设备上测试此应用程序时,我做了以下观察:

  1. 在OS为2.2.2的motorola设备上,Home键被禁用。
  2. 在操作系统为2.3.5的HTC设备上,主页按钮被禁用。
  3. 在索尼操作系统为2.3.7时,主页按钮被禁用。
  4. 在操作系统为2.2.1和2.3.3的Samsung上,主页按钮被禁用。
  5. 在操作系统为2.3.6和4.0.4的Samsung上,主页按钮仍然处于启用状态。
  6. 这些观察似乎非常矛盾。

    是否有任何人有任何想法,为什么不同的设备表现不同,以及处理这种情况的最佳方式是什么。

    据我所知,到目前为止,没有一家供应商定制过Android操作系统。每个人都在它上面放置UI层,但没有人触及内部。

3 个答案:

答案 0 :(得分:7)

  

我知道这个问题已被多次询问,答案总是“我们不能禁用主页按钮”。

如果您想处理HOME按钮,请实现主屏幕。

  

有没有人知道,为什么不同的设备表现不同

因为它们是不同的设备,并且供应商进行了更改。此外,在4.0.4的情况下,可能还添加了其他保护措施,以帮助防止恶意软件作者在不作为主屏幕的情况下劫持HOME按钮。

  

处理此类情景的最佳方法是什么

如果您想处理HOME按钮,请实现主屏幕。

  

每个人都在其上面放置UI图层,但没有人触及内部。

这是不正确的。几乎每个设备供应商都在不同程度上“触及了内部”。只要他们与Play商店见面the compatibility requirements,Google就会认为他们的更改已被接受。

答案 1 :(得分:6)

您可能想尝试一下:

@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" />

答案 2 :(得分:0)

正如我的问题本身所提到的那样,对于低于2.3.6的设备,OS覆盖keypress()功能的效果很好。

问题从2.3.6开始。我不知道这些设备供应商做了什么,但keypress()功能在所有设备上都不起作用。

同样从ICS开始,谷歌已停止一次性使用keypress()功能。

那我们该怎么做呢。

我看到它的方式,如果我们试图覆盖主页按钮然后它是不可能的,但绝对我们可以听它。

在我们的Android清单中,我们使用<category android:name="android.intent.category.HOME" />过滤器,这使得我们的活动成为家庭替换屏幕。 现在,当您按下主页按钮时,弹出的内容解析器将始终显示并询问哪个应用程序,即默认启动程序或您的应用程序应响应主页按钮单击。你总是可以在那里选择你的应用程序。

但这不会覆盖或禁用主页按钮。每当你按下主页按钮时,同样的事情会一次又一次地重复,直到你的应用程序默认为止,通过点击内容解析器弹出窗口中给出的默认复选框。

现在,一旦您选择了应用程序作为默认主页,按下将始终启动您的应用程序。

完成......不。出现的问题是,如果您离开应用程序,主页按钮仍会启动您的应用程序。一旦你的工作完成,如何摆脱它。

我们要做的是关闭或调用活动的finish(),在此之前我们应该使用以下方法将包设置设置为默认值:

paramPackageManager1.setComponentEnabledSetting(localComponentName2, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 1);

这会将您的活动中的主页按钮关联起来。