首页 > 系统 > Android > 正文

Android监听Home键和Back键的区别介绍

2019-10-24 21:12:38
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了Android监听Home键和Back键的区别介绍,本文还同时给出了Home键监听的实现代码,需要的朋友可以参考下

一:Android 中Home键监听和Back键监听的区别:

(1).在Android中,当按下Home键的时候,默认情况下Stop前台的Activity,即Activity设置成停止状态【onStop()】,而不是销毁状态【onDestory()】。如果再次启动该Activity,不是调用onCreate()方法,而是调用onSavedInstanceState方法。则是从onRestart()开始-onStart()-onResume()。

(2).当按下back键则不同,back键默认finish前台的activity,即activity的状态为onDestory为止,再次启动该activity则从onCreate开始,不会调用onSavedInstanceState方法。

总而言之:按下Home键会返回桌面,而back则会返回前一个activity。

在这里Back键的实现方法就不赘述了,主要讲解一下Home键的实现方式吧。以下是我找的参考资料自己思考的。请大家给出建议。

Home键监听的实现方法:

(1).在onResum里面注册广播,OnPause里面注销广播。

(2).在广播中拦截Intent.ACTION_CLOSE_SYSTEM_DIALOGS 这个Action ,通过获取Reason字段 来判断长按 还是单击Home键。

代码如下:

(1).Home键监听封装类:

 

 
  1. package com.scd.homewatcher.util; 
  2.  
  3. import android.content.BroadcastReceiver; 
  4. import android.content.Context; 
  5. import android.content.Intent; 
  6. import android.content.IntentFilter; 
  7. import android.util.Log; 
  8.  
  9. /** 
  10. * Home键监听封装 
  11. *  
  12. * @author way 
  13. *  
  14. */ 
  15. public class HomeWatcher { 
  16.  
  17. // 回调接口 
  18. public interface OnHomePressedListener { 
  19.  
  20. public void onHomePressed(); 
  21.  
  22. public void onHomeLongPressed(); 
  23. } 
  24.  
  25. private static final String TAG = "HomeWatcher"; 
  26. /** 上下文 */ 
  27. private Context mContext; 
  28. /** 过滤器 */ 
  29. private IntentFilter mFilter; 
  30. /** 接口 */ 
  31. private OnHomePressedListener mListener; 
  32. /** 广播接收者 */ 
  33. private InnerRecevier mRecevier; 
  34.  
  35. public HomeWatcher(Context context) { 
  36. mContext = context; 
  37. mRecevier = new InnerRecevier(); 
  38. mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
  39. } 
  40.  
  41. /** 
  42. * 设置监听 
  43. *  
  44. * @param listener 
  45. */ 
  46. public void setOnHomePressedListener(OnHomePressedListener listener) { 
  47. mListener = listener; 
  48. } 
  49.  
  50. /** 
  51. * 开始监听,注册广播 
  52. */ 
  53. public void startWatch() { 
  54. if (mRecevier != null) { 
  55. mContext.registerReceiver(mRecevier, mFilter); 
  56. } 
  57. } 
  58.  
  59. /** 
  60. * 停止监听,注销广播 
  61. */ 
  62. public void stopWatch() { 
  63. if (mRecevier != null) { 
  64. mContext.unregisterReceiver(mRecevier); 
  65. } 
  66. } 
  67.  
  68. /** 
  69. * 广播接收者 
  70. */ 
  71. private class InnerRecevier extends BroadcastReceiver { 
  72. final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
  73. final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
  74. final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
  75. final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
  76.  
  77. @Override 
  78. public void onReceive(Context context, Intent intent) { 
  79. String action = intent.getAction(); 
  80. if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
  81. String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
  82. if (reason != null) { 
  83. Log.i(TAG, "action:" + action + ",reason:" + reason); 
  84. if (mListener != null) { 
  85. if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
  86. // 短按home键 
  87. mListener.onHomePressed(); 
  88. } else if (reason 
  89. .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
  90. // 长按home键 
  91. mListener.onHomeLongPressed(); 
  92. } 
  93. } 
  94. } 
  95. } 
  96. } 
  97. } 
  98. } 

(2).MainActivity类:

 

 
  1. package com.scd.homewatcher; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.KeyEvent; 
  6. import android.widget.Toast; 
  7.  
  8. import com.scd.homewatcher.util.HomeWatcher; 
  9. import com.scd.homewatcher.util.HomeWatcher.OnHomePressedListener; 
  10.  
  11. public class MainActivity extends Activity implements OnHomePressedListener { 
  12. private HomeWatcher mHomeWatcher; 
  13.  
  14. @Override 
  15. protected void onCreate(Bundle savedInstanceState) { 
  16. super.onCreate(savedInstanceState); 
  17. setContentView(R.layout.activity_main); 
  18.  
  19. } 
  20.  
  21. @Override 
  22. protected void onResume() { 
  23. mHomeWatcher = new HomeWatcher(this); 
  24. mHomeWatcher.setOnHomePressedListener(this); 
  25. // 注册广播 
  26. mHomeWatcher.startWatch(); 
  27. super.onResume(); 
  28. } 
  29.  
  30. @Override 
  31. protected void onPause() { 
  32. mHomeWatcher.setOnHomePressedListener(null); 
  33. // 注销广播 
  34. mHomeWatcher.stopWatch(); 
  35. super.onPause(); 
  36. } 
  37.  
  38. @Override 
  39. public void onHomePressed() { 
  40. // TODO 
  41. Toast.makeText(this, "短按Home键,实现自己的逻辑", Toast.LENGTH_SHORT).show(); 
  42.  
  43. } 
  44.  
  45. @Override 
  46. public void onHomeLongPressed() { 
  47. // TODO 
  48. Toast.makeText(this, "长按Home键,实现自己的逻辑", Toast.LENGTH_SHORT).show(); 
  49.  
  50. } 
  51.  
  52. @Override 
  53. public boolean onKeyDown(int keyCode, KeyEvent event) { 
  54. if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
  55. System.out.println("按下了back键 onKeyDown()"); 
  56. return false; 
  57. } else { 
  58. return super.onKeyDown(keyCode, event); 
  59. } 
  60.  
  61. } 
  62.  
  63. @Override 
  64. public void onBackPressed() { 
  65. // super.onBackPressed()会自动调用finish()方法,关闭 
  66. super.onBackPressed(); 
  67. } 
  68.  
  69. } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表