52

我在我的一个 Android 活动中有这个方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        Log.d("Test", "Back button pressed!");
    }
    else if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        Log.d("Test", "Home button pressed!");
    }
    return super.onKeyDown(keyCode, event);
}

但是,即使 KEYCODE_HOME 有效,日志方法也不会触发。这适用于后退按钮。有谁知道这是为什么以及如何使它工作?

4

10 回答 10

35

Home 按钮是一个非常危险的覆盖按钮,因此,Android 不会让你覆盖它的行为,就像你做 BACK 按钮一样。

看看这个讨论。

您会注意到主页按钮似乎是作为意图调用实现的,因此您最终必须将意图类别添加到您的活动中。然后,任何时候用户回家,你的应用都会作为一个选项出现。您应该考虑使用主页按钮要完成的任务。如果它不替换设备的默认主屏幕,我会警惕超载 HOME 按钮,但这是可能的(根据上述线程中的讨论。)

于 2011-01-24T15:59:33.943 回答
22

我花了将近一个月的时间来度过这个难关。刚才我解决了这个问题。在您的活动的 onPause() 中,您必须包含以下 if 条件:

    if (this.isFinishing()){
        //Insert your finishing code here
    }

函数 isFinishing() 返回一个布尔值。如果您的应用程序实际上正在关闭,则为 True,如果您的应用程序仍在运行但例如屏幕关闭,则为 False。

希望能帮助到你!

于 2011-08-13T12:34:09.987 回答
12

HOME 按钮不能被应用程序截取。这是 Android 中的设计行为。原因是为了防止恶意应用程序控制您的手机(如果用户无法按返回或主页,他可能永远无法退出应用程序)。Home 按钮被认为是用户的“安全区”,将始终启动用户配置的 Home 应用程序。

上述情况的唯一例外是任何配置为家庭替代的应用程序。这意味着它在其 AndroidManifest.xml 中为相关活动声明了以下内容:

<intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.HOME" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

onNewIntent按下主页按钮时,将调用当前主页应用程序的活动。

于 2011-01-24T16:05:21.010 回答
9

我发现当我按下 HOME 按钮时,会调用 onStop() 方法。您可以使用以下代码对其进行监控:

@Override
    protected void onStop() 
    {
        super.onStop();
        Log.d(tag, "MYonStop is called");
        // insert here your instructions
    }
于 2012-03-25T20:55:45.137 回答
3

KeyEvent.KEYCODE_HOME不能被拦截。

如果可能的话,那将是非常糟糕的。

(编辑):我只看到尼克斯的回答,这是完全完整的;)

于 2011-01-24T16:00:43.070 回答
3

我有一个处理主页按钮按下的简单解决方案。这是我的代码,它可能很有用:

public class LifeCycleActivity extends Activity {


boolean activitySwitchFlag = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        activitySwitchFlag = true;
        // activity switch stuff..
        return true;
    }
    return false;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override 
public void onPause(){
    super.onPause();
    Log.v("TAG", "onPause" );
    if(activitySwitchFlag)
        Log.v("TAG", "activity switch");
    else
        Log.v("TAG", "home button");
    activitySwitchFlag = false;
}

public void gotoNext(View view){
    activitySwitchFlag = true;
    startActivity(new Intent(LifeCycleActivity.this, NextActivity.class));
}

}

总而言之,在活动中放置一个布尔值,当活动切换发生时(startactivity事件),设置变量并在onpause事件中检查这个变量..

于 2011-09-16T14:00:37.807 回答
3

使用广播接收器

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // something
    // for home listen
    InnerRecevier innerReceiver = new InnerRecevier();
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    registerReceiver(innerReceiver, intentFilter);

}



// for home listen
class InnerRecevier extends BroadcastReceiver {

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                    // home is Pressed
                }
            }
        }
    }
}
于 2018-08-22T03:48:54.430 回答
2

使用onPause()方法在主页按钮上执行您想要执行的操作。

于 2011-10-08T19:19:40.687 回答
1

我也为 HOME 按钮挣扎了一段时间。当用户单击 HOME 按钮时,我想停止/跳过后台服务(轮询位置)。

这是我实施为“类似黑客”的解决方案;

使用布尔值在 SharedPreferences 上保持应用程序的状态

在每一个活动上

onResume() -> 设置 appactive=true

onPause() -> 设置 appactive=false

并且后台服务在每个循环中检查 appstate,跳过操作

如果 appactive=false

它对我来说很好用,至少不再耗尽电池了,希望这对我有帮助....

于 2011-06-01T08:01:43.197 回答
0

像这样定义变量activity

const val SYSTEM_DIALOG_REASON_KEY = "reason"
const val SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"
const val SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"

像这样定义您的广播接收器类:

class ServiceActionsReceiver: BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
            
            val action = intent!!.action
            if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
                val reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY)
                if (reason != null) {
                    if (reason == SYSTEM_DIALOG_REASON_HOME_KEY) {
                        //do what you want to do when home pressed
                    } else if (reason == SYSTEM_DIALOG_REASON_RECENT_APPS) {
                        //do what you want to do when recent apps pressed
                    }
                }
            }
        }
    }

onCreate在这样的方法或方法上注册接收者onResume

val filter = IntentFilter()
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
registerReceiver(receiver, filter)

在清单中添加接收器,如下所示:

<receiver android:name=".ServiceActionsReceiver">
            <intent-filter >
                <actionandroid:name="android.intent.action.CLOSE_SYSTEM_DIALOGS"/>
            </intent-filter>
</receiver>
于 2021-04-28T08:48:06.483 回答