Android Home键监听

偏执的太偏执、 2022-06-05 08:28 502阅读 0赞

Android Home键监听

有时候我们在我们需要监听Home键的事件,关闭整个程序或者做其他事情,我接手的几个蓝牙项目都是要监听Home键事件,并彻底退出程序,防止程序在后台一直进行数据交互。

监听Back键,我们都知道重写onBackPressed方法就可以了。但是监听Home键就有点麻烦了。

我们可以注解掉Back键,让它不起作用,但是Home键目前只能监听还不能注解掉。

方法一:onUserLeaveHint方法

实际不可行的方法

  1. /**
  2. * Home触发的回调方法
  3. * 这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。
  4. * 但是有个缺点,比如页面处于不可见的情况下也会回调这个方法,页面跳转到其他页面也是会回调
  5. * 简单点说,这个方法和Actvity的onStop方法是一样的,在页面不可见的时候回调
  6. */
  7. @Override
  8. protected void onUserLeaveHint() {
  9. super.onUserLeaveHint();
  10. Log.i(LOG_TAG, "onUserLeaveHint");
  11. finish();
  12. }

onUserLeaveHint方法,虽然可以监听Home键的事件,但是跳转到其他页面这个方法也是回调,所以不符合需求。
这个方法还有一个缺点,就是首次打开程序时,页面显示的时候也会回调这个方法。

方法二:监听广播Action:Intent.ACTION_CLOSE_SYSTEM_DIALOGS

1.创建一个定义的广播接收者

  1. package com.example.liwenzhi.homelistendemo;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.util.Log;
  6. /**
  7. * 自定义的广播接收者
  8. */
  9. public class HomeWatcherReceiver extends BroadcastReceiver {
  10. private static final String LOG_TAG = " TAG HomeReceiver";
  11. private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
  12. //action内的某些reason
  13. private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";//home键旁边的最近程序列表键
  14. private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";//按下home键
  15. private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";//锁屏键
  16. private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";//某些三星手机的程序列表键
  17. @Override
  18. public void onReceive(Context context, Intent intent) {
  19. String action = intent.getAction();
  20. // App app = (App) context.getApplicationContext();
  21. Log.i(LOG_TAG, "onReceive: action: " + action);
  22. if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
  23. //Action
  24. // android.intent.action.CLOSE_SYSTEM_DIALOGS
  25. String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
  26. Log.i(LOG_TAG, "reason: " + reason);
  27. if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) { // 短按Home键
  28. //可以在这里实现关闭程序操作。。。
  29. Log.i(LOG_TAG, "homekey");
  30. } else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {
  31. //Home键旁边的显示最近的程序的按钮
  32. // 长按Home键 或者 activity切换键
  33. Log.i(LOG_TAG, "long press home key or activity switch");
  34. } else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) { // 锁屏,似乎是没有反应,监听Intent.ACTION_SCREEN_OFF这个Action才有用
  35. Log.i(LOG_TAG, "lock");
  36. } else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) { // samsung 长按Home键
  37. Log.i(LOG_TAG, "assist");
  38. }
  39. }
  40. }
  41. }

这个广播接收者可以写成内部类,也可以是在其他包里面。

2.监听Home键的关键代码

  1. package com.example.liwenzhi.homelistendemo;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.content.IntentFilter;
  5. import android.os.Bundle;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.util.Log;
  8. import android.view.View;
  9. public class MainActivity extends AppCompatActivity {
  10. String LOG_TAG = "TAG";
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. registerHomeKeyReceiver(this);
  16. }
  17. @Override
  18. protected void onDestroy() {
  19. super.onDestroy();
  20. Log.i(LOG_TAG, "onDestroy");
  21. unregisterHomeKeyReceiver(this);
  22. }
  23. //自定义的广播接收者
  24. private HomeWatcherReceiver mHomeKeyReceiver = null;
  25. //注册广播接收者,监听Home键
  26. private void registerHomeKeyReceiver(Context context) {
  27. Log.i(LOG_TAG, "registerHomeKeyReceiver");
  28. mHomeKeyReceiver = new HomeWatcherReceiver();
  29. IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
  30. context.registerReceiver(mHomeKeyReceiver, homeFilter);
  31. }
  32. //取消监听广播接收者
  33. private void unregisterHomeKeyReceiver(Context context) {
  34. Log.i(LOG_TAG, "unregisterHomeKeyReceiver");
  35. if (null != mHomeKeyReceiver) {
  36. context.unregisterReceiver(mHomeKeyReceiver);
  37. }
  38. }
  39. }

通过上面的代码就能实现Home键的监听,并做相应的操作,如果跳转到其他页面,只要没有关闭这个页面对象,还是在监听Home键的。

上面自定义的广播接收者可以写一个回调接口来监听Home键,也可以把自定义的的广播接收者类写成Activity的内部类。

共勉:人生的高度不是决定于你失败过多少次,失败得有多惨,而是你最终能成功的高度。

发表评论

表情:
评论列表 (有 0 条评论,502人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android Home监听

    Android Home键监听 有时候我们在我们需要监听Home键的事件,关闭整个程序或者做其他事情,我接手的几个蓝牙项目都是要监听Home键事件,并彻底退出程序,防止程