输入事件分发流程:
1.InputReader 线程通过 EventHub 监听 /dev/input 内的文件
2.InputReader 得到输入事件,封装后存入 InputDispatcher 的队列
3.唤醒 InputDispatcher 
4.InputDispatcher 取出输入事件,并传递给 Window

<1>.C++层  
frameworks/native/services/inputflinger/InputDispatcher.cpp
  KeyEvent event;
  event.initialize(args->deviceId, args->source, args->action,flags, keyCode, args->scanCode, metaState, 0 /*repeatCount默认值为:0;修改值的可以逻辑在java里/,args->downTime, args->eventTime);  
void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {  
  mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);  
}  
<2>.JNI层
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp  
void NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags){  
  env->CallIntMethod(mServiceObj,gServiceClassInfo.interceptKeyBeforeQueueing/*对应java层*/,keyEventObj, policyFlags);  
 }  
<3>java层
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java  
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {  
  case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:{  
    result &= ~ACTION_PASS_TO_USER; //no return app  
    Log.e(TAG,"KeyCode = " + String.valueOf(event.getKeyCode()) + " action = " + String.valueOf(event.getAction()));  
    if(!down){  
      Log.d(TAG,"DownTime = "+ String.valueOf(event.getDownTime())+ "EventTime = " + String.valueOf(event.getEventTime()));  
      p  
    if((event.getEventTime() - event.getDownTime()) >= 3000) {  //按键大于3s
      Intent mIntent = new Intent();  
      mIntent.putExtra("blue_receive","start");  
      mIntent.setAction("com.test");  
      Log.e(TAG,"send broading...");  

      mContext.sendBroadcast(mIntent,null);  

      Log.e(TAG,"Time > 3s");  
    }else{  
      Log.e(TAG,"Time < 3s");  
    }  
    }  
    break;  
  }  
 }  

参考:http://blog.csdn.NET/u010122827/article/category/5944877
    http://andevele.com/2016/07/07/keypad_first/
    http://blog.csdn.net/u012439416/article/details/54605998

更多相关文章

  1. Android默认输入法语言的修改以及SettingsProvider作用
  2. 如何在Android模拟器上安装apk文件
  3. 在Eclipse中安装ADT
  4. android 事件传递机制
  5. Android(安卓)View框架总结(九)KeyEvent事件分发机制
  6. Android事件分发机制的探索与发现之ViewGroup篇
  7. Android(安卓)View的onClick回调机制
  8. android滑动事件监听
  9. Android(安卓)项目如何获取MD5和SHA1

随机推荐

  1. android ListView没有数据时信息显示
  2. android scaleType的属性
  3. 聊天室服务端
  4. Android开发,使用背景图(xml drawable)为vie
  5. PANIC: Could not open AVD config file:
  6. Android利用Fiddler进行网络数据抓包
  7. Android(安卓)debug.keystore的密码
  8. Android(安卓)学习成品
  9. View Android(安卓)Source Code in Eclip
  10. Android(安卓)资源文件中的符号含义与说