我可以覆盖应用程序中的"主页"按钮吗?

Smi*_*ith 18 android

我想在我的android上创建自己的"主页"屏幕,我想从我的应用程序中调用该主屏幕.

如何覆盖"主页"按钮,以便在按下时应用程序将重定向到我的主屏幕而不是默认的主屏幕?是否可以覆盖主页按钮?

小智 12

覆盖以下方法.

@Override
public void onAttachedToWindow()
{  
    Log.i("TESTE", "onAttachedToWindow");
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();  
}
Run Code Online (Sandbox Code Playgroud)

使用此方法,HOME按钮在此活动中停止工作(仅此活动).然后你重新实现,因为它是一个普通的按钮事件(例如后退按钮).

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HOME) {
        Log.i("TESTE", "BOTAO HOME");
        return true;
    }
    return super.onKeyDown(keyCode, event);    
}
Run Code Online (Sandbox Code Playgroud)

  • @ateiob:幸运的是,这个安全漏洞已经修复,从Android 4.0开始. (7认同)
  • @ateiob:如果恶意软件阻止您删除恶意软件,那么这是一个安全漏洞. (2认同)

bar*_*ara 10

AndroidManifest.xml

<activity
    ...
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
        ....
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

您需要launchMode="singleTask"将意图传递给已在运行的应用程序,而不是创建新实例.

在活动中:

   @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (Intent.ACTION_MAIN.equals(intent.getAction())) {
            Log.i("MyLauncher", "onNewIntent: HOME Key");

        }
    }
Run Code Online (Sandbox Code Playgroud)

你没有得到关键事件


mar*_*kus 5

主页按钮应该只做一件事而且一件事.让用户返回HOME屏幕.即使你可以覆盖它的行为,这将是一个非常用户不友好的事情.所以不要这样做,以不同的方式解决你的问题!


Ale*_*dam 2

从 Android 4.0 开始,这个答案将不再有效。

正确的解决方案是创建一个可以拦截 Home 意图的应用程序,如下面 @bara 的回答所示


您可以像任何其他按钮一样覆盖主页按钮:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_HOME)) {
        Toast.makeText(this, "You pressed the home button!", Toast.LENGTH_LONG).show();                     
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

  • AFAIK,这不适用于任何版本的 Android,当然也不适用于最近的任何版本。 (51认同)