看网上,大家对Home和长按Home键的监听,都有相应的监听方法,但是对于长按Menu键的监听,没有比较详细的资料,我把我的一个在launcher界面来监听长按Menu键的一个实现和大家探讨一下:

我要实现的功能是在launcher界面,当用户长按Menu键,来执行一个XXXXXX操作。

1.修改源码:PhoneWindowManager.java---------frameworks\base\policy\src\com\android\internal\policy\impl

(1) 定义一个长按Menu键的标识位

    //konka  hexiaoming 20130409 startboolean mMenuKeyLongPressed = false;//konka   hexiaoming 20130409 end

(2)重点修改interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags)方法:

在launcher界面长按Menu,发出广播:android.intent.action.LONG_PRESS_MENU_KEY

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {final boolean keyguardOn = keyguardOn();final int keyCode = event.getKeyCode();final int repeatCount = event.getRepeatCount();final int metaState = event.getMetaState();final int flags = event.getFlags();final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;//konka  hexiaoming 20130409 startfinal boolean up = event.getAction() == KeyEvent.ACTION_UP;//konka  hexiaoming 20130409 end        final boolean canceled = event.isCanceled();Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="+ repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed+ " canceled=" + canceled);// If we think we might have a volume down & power key chord on the way// but we're not sure, then tell the dispatcher to wait a little while and// try again later before dispatching.if (mScreenshotChordEnabled && (flags & KeyEvent.FLAG_FALLBACK) == 0) {if (mVolumeDownKeyTriggered && !mPowerKeyTriggered) {final long now = SystemClock.uptimeMillis();final long timeoutTime = mVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS;if (now < timeoutTime) {return timeoutTime - now;}}if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN&& mVolumeDownKeyConsumedByScreenshotChord) {if (!down) {mVolumeDownKeyConsumedByScreenshotChord = false;}return -1;}}// First we always handle the home key here, so applications// can never break it, although if keyguard is on, we do let// it handle it, because that gives us the correct 5 second// timeout.if (keyCode == KeyEvent.KEYCODE_HOME) {/// M: [ALPS00054781]Dispatch the home key to the application @{if (win != null && win.getAttrs() != null) {final int flag = win.getAttrs().flags;if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {// the window wants to handle the home key, so dispatch it to it.return 0;}}/// @}// If we have released the home key, and didn't do anything else// while it was pressed, then it is time to go home!if (!down) {final boolean homeWasLongPressed = mHomeLongPressed;mHomePressed = false;mHomeLongPressed = false;if (!homeWasLongPressed) {if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {try {IStatusBarService statusbar = getStatusBarService();if (statusbar != null) {statusbar.cancelPreloadRecentApps();}} catch (RemoteException e) {Slog.e(TAG, "RemoteException when showing recent apps", e);// re-acquire status bar service next time it is needed.mStatusBarService = null;}}mHomePressed = false;if (!canceled) {// If an incoming call is ringing, HOME is totally disabled.// (The user is already on the InCallScreen at this point,// and his ONLY options are to answer or reject the call.)boolean incomingRinging = false;try {ITelephony telephonyService = getTelephonyService();if (telephonyService != null) {incomingRinging = telephonyService.isRinging();}} catch (RemoteException ex) {Log.w(TAG, "RemoteException from getPhoneInterface()", ex);}if (incomingRinging) {Log.i(TAG, "Ignoring HOME; there's a ringing incoming call.");} else {/// M:[AppLaunchTime] Improve the mechanism of AppLaunchTimeif (mAppLaunchTimeEnabled) Slog.i(TAG, "[AppLaunch] Home key pressed");launchHomeFromHotKey();}} else {Log.i(TAG, "Ignoring HOME; event canceled.");}return -1;}}// If a system window has focus, then it doesn't make sense// right now to interact with applications.WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;if (attrs != null) {final int type = attrs.type;if (type == WindowManager.LayoutParams.TYPE_KEYGUARD|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {// the "app" is keyguard, so give it the keyreturn 0;}final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;for (int i=0; i<typeCount; i++) {if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {// don't do anything, but also don't pass it to the appreturn -1;}}}if (down) {if (!mHomePressed && mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {try {IStatusBarService statusbar = getStatusBarService();if (statusbar != null) {statusbar.preloadRecentApps();}} catch (RemoteException e) {Slog.e(TAG, "RemoteException when preloading recent apps", e);// re-acquire status bar service next time it is needed.mStatusBarService = null;}}if (repeatCount == 0) {mHomePressed = true;} else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {if (!keyguardOn) {handleLongPressOnHome();}}}return -1;} else if (keyCode == KeyEvent.KEYCODE_MENU) {// Hijack modified menu keys for debugging featuresfinal int chordBug = KeyEvent.META_SHIFT_ON;//konka  hexiaoming 20130409 startif(repeatCount == 3){mMenuKeyLongPressed = true;}Log.i("hexiaoming_debug", "repeatCount:"+repeatCount);Log.i("hexiaoming_debug", "mMenuKeyLongPressed:"+mMenuKeyLongPressed);/**is launcher UI*************/boolean isLauncherUI = false; List<String> homePackageNames = new ArrayList<String>(); //桌面应用列表 PackageManager packageManager = mContext.getPackageManager();  //属性   Intent intentL = new Intent(Intent.ACTION_MAIN);  intentL.addCategory(Intent.CATEGORY_HOME);  List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intentL,PackageManager.MATCH_DEFAULT_ONLY);  for(ResolveInfo ri : resolveInfo){  homePackageNames.add(ri.activityInfo.packageName);  }  ActivityManager mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);  List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);  isLauncherUI = homePackageNames.contains(rti.get(0).topActivity.getPackageName());  Log.i("hexiaoming_debug", "isLauncherUI:"+isLauncherUI);Log.i("hexiaoming_debug", "down:"+down);Log.i("hexiaoming_debug", "up:"+up);//if(up && mMenuKeyLongPressed){if(down && mMenuKeyLongPressed && isLauncherUI){Log.i("hexiaoming_debug", "long press key:MENU");Intent menuLongPress = new Intent();menuLongPress.setAction("android.intent.action.LONG_PRESS_MENU_KEY");mContext.sendBroadcast(menuLongPress);   mMenuKeyLongPressed = false;return -1;}else{if (down && repeatCount == 0) {//if (up && repeatCount == 0) {//konka  hexiaoming 20130409 endLog.i("hexiaoming_debug", "press key:MENU");if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {Intent intent = new Intent(Intent.ACTION_BUG_REPORT);mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT,null, null, null, 0, null, null);return -1;} else if (SHOW_PROCESSES_ON_ALT_MENU &&(metaState & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) {Intent service = new Intent();service.setClassName(mContext, "com.android.server.LoadAverageService");ContentResolver res = mContext.getContentResolver();boolean shown = Settings.Global.getInt(res, Settings.Global.SHOW_PROCESSES, 0) != 0;if (!shown) {mContext.startService(service);} else {mContext.stopService(service);}Settings.Global.putInt(res, Settings.Global.SHOW_PROCESSES, shown ? 0 : 1);return -1;}}//konka    hexiaoming 20130410 start}//konka   hexiaoming 20130409 end

(3)定义一个广播接收器,接收长按Menu的广播,执行XXX操作

public class MenuKeyBroadcastReceiver extends BroadcastReceiver{public final String INTENT_ACTION_LONG_PRESS_MENU_KEY = "android.intent.action.LONG_PRESS_MENU_KEY";@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub
//      Intent menuLongPress = new Intent();
//      menuLongPress.setAction(INTENT_ACTION_LONG_PRESS_MENU_KEY);
//      context.sendBroadcast(menuLongPress);//long time = System.currentTimeMillis();String action = intent.getAction();/**is speech client wakeup**/boolean isWakeUp = Settings.System.getInt(context.getContentResolver(), "SPEECH_WAKE", 0) == 1 ? true : false;/**is launcher UI*************/boolean isLauncherUI = false; List<String> homePackageNames = new ArrayList<String>(); //桌面应用列表 PackageManager packageManager = context.getPackageManager();  //属性   Intent intentL = new Intent(Intent.ACTION_MAIN);  intentL.addCategory(Intent.CATEGORY_HOME);  List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intentL,PackageManager.MATCH_DEFAULT_ONLY);  for(ResolveInfo ri : resolveInfo){  homePackageNames.add(ri.activityInfo.packageName);  }  ActivityManager mActivityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);  List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);  isLauncherUI = homePackageNames.contains(rti.get(0).topActivity.getPackageName());         if(isWakeUp == true && INTENT_ACTION_LONG_PRESS_MENU_KEY.equals(action) && isLauncherUI == true){Intent intentOpenSpeechKShow = new Intent(context, SpeechKShow.class);intentOpenSpeechKShow.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intentOpenSpeechKShow);Log.i("hexiaoming_debug", "长按MENU键,在Launcher界面弹出康佳小兵");}  }}

(4)注册长按MENU键的广播接收器

        <!-- konka-hexiaoming-Speech-20130408-start  --><receiver android:name=".menukeybroadcastreceiver.MenuKeyBroadcastReceiver"><intent-filter>  <action android:name="android.intent.action.LONG_PRESS_MENU_KEY"></action>   </intent-filter>             </receiver><!-- konka-hexiaoming-Speech-20130408-end  -->

PhoneWindowManager.java下载地址:

http://download.csdn.net/detail/hfreeman2011/5264516

当然还有一个就是监听所有界面的长按MENU键,这个实现参考上面的修改,只要做一点点修改就能OK噢,亲,你自己来修改验证一下吧!!!

Android 长按Menu键的监听相关推荐

  1. android底层按键监听,Android应用中Back键的监听及处理实例

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  2. Android应用中Back键的监听及处理

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  3. android监听应用服务,Android应用中Back键的监听及处理实例

    MainActivity如下: 复制代码 代码如下: package cn.testnbackpressed; import android.os.Bundle; import android.vie ...

  4. Android中对menu、home、back键的监听

    Android中对menu.home.back键的监听,通过KeyEvent中的常量值来判断用户点击了哪个按钮. 其中对home键的监听需先在manifest文件中添加 <uses-permis ...

  5. android HOME键的监听

    2019独角兽企业重金招聘Python工程师标准>>> Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back ...

  6. 【Home键的监听】

    1. Home 键的事件监听 对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所 ...

  7. Android事件的响应,Android 开发事件响应之基于监听的事件响应

    Android 开发事件响应之基于监听的事件响应 本文将介绍Android 操作系统如何通过监听来实现对事件的响应. Android 开发事件响应之基于监听的事件响应 背景介绍 Android 开发事 ...

  8. Android广播接实现电话的监听(电话的状态,拦截)

    Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...

  9. Android RecyclerView(九)滑动监听综述

    Android RecyclerView(九)滑动监听 1 RecyclerView 的滑动监听 1.1 RecyclerView 设置滑动监听 mRecyclerView.setOnScrollLi ...

  10. Android实现来电和去电的监听

    写个实例实现Android中来电和去电的监听,来电可以使用PhoneStateListener对电话状态的改变进行监听,去电需要动态或者静态去注册广播接收器,对去电进行监听: 来电: 来电所对应的三种 ...

最新文章

  1. RStudio v1.2.1335 发布,R 语言的集成开发环境
  2. 解决webpack打包bootstrap报字体不能解析问题
  3. 划词翻译软件QTranslate 6.7.3 中文绿色版
  4. Windows SDK程序的输出文字和格式控制(wsprintf、swprintf、Textout)
  5. 从来没有一种技术是为了解决复用、灵活组合、定制开发的问题
  6. System之Ubuntu:VMware虚拟机 Ubuntu安装详细过程(图文教程,最强攻略,步骤详细,建议收藏)
  7. 洪嘉振 计算多体系统动力学pdf_如何在多体动力学模型中评估齿轮啮合刚度
  8. js判断fck编辑器内容是否为空并获得焦点
  9. 用Adapter模式重构以前系统的登录权限验证
  10. SlickOne 敏捷开发框架介绍(二) -- 多用户/多租户/SAAS软件基础框架实现
  11. anaconda如何卸载库_小白必看!Anaconda安装全攻略
  12. ssm框架整合_框架整合战斗压缩粮篇SpringCloud+SpringBoot+SSM
  13. Mongoose 是什么?
  14. java复选框互斥_jmu-Java-07多线程-互斥访问 (5分)
  15. 16查看走线长度_糟糕!丝印放到表层走线上面啦
  16. Wix学习整理(6)——安装快捷方式
  17. java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...
  18. python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
  19. MATLAB快速傅里叶变换(fft)函数详解
  20. 体温枪PCBA设计生产流程

热门文章

  1. oracle在运行存储的时候出现:同义词转换不再有效
  2. 奇兔recovery卡刷教程_OPPO A59s 刷入奇兔recovery及root权限刷机教程
  3. 编写程序 - 打印购物小票.
  4. Sql Sugar使用仓储实现增删改查
  5. oracle 游离块修复,求助讨论---上颌单侧后牙游离缺失的修复
  6. 一阶二阶常微分方程解法
  7. 面试案例(2019)一
  8. Linux虚拟机快速搭建RabbitMQ(解压版)完整流程(简单明了、不亲测能写这么多)
  9. 被拖欠2个月工资,最后我拿到了6个月《打工人的那些事》
  10. 顶级的 18 款开源低代码开发平台