Dialer设置按键进入拨号盘--源码分析

简介: 笔记

setDefaultKeyMode (int mode)用来设置一个Activity的默认的按键模式,

也就是指这种情况,当Activity中发生了一些按键事件,但是这些事件没有被任何控件Listen到时(截获时),系统应该如何处理这些按键事件。

mode一共有五种

  • DEFAULT_KEYS_DISABLE
  • DEFAULT_KEYS_DIALER
  • DEFAULT_KEYS_SHORTCUT
  • DEFAULT_KEYS_SEARCH_LOCAL
  • DEFAULT_KEYS_SEARCH_GLOBAL

今天看一下源码是如何处理的。


1、首先fsetDefaultKeyMode 定义在Activity.java中


public final void setDefaultKeyMode(@DefaultKeyMode int mode) {
         mDefaultKeyMode = mode;
         // Some modes use a SpannableStringBuilder to track & dispatch input events
         // This list must remain in sync with the switch in onKeyDown()
         switch (mode) {
         case DEFAULT_KEYS_DISABLE:
         case DEFAULT_KEYS_SHORTCUT:
             mDefaultKeySsb = null;      // not used in these modes
             break;
         case DEFAULT_KEYS_DIALER:
         case DEFAULT_KEYS_SEARCH_LOCAL:
         case DEFAULT_KEYS_SEARCH_GLOBAL:
             mDefaultKeySsb = new SpannableStringBuilder();
             Selection.setSelection(mDefaultKeySsb,0);
             break;
         default:
             throw new IllegalArgumentException();
         }
     }

如果是DEFAULT_KEYS_DIALER模式,就用SpannableStringBuilder来记录按下的字符。


2、依然在Activity.java中,处理按键onKeyDown方法


public boolean onKeyDown(int keyCode, KeyEvent event)  {
        ...
           switch (mDefaultKeyMode) {
           case DEFAULT_KEYS_DIALER:
               Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
               intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               startActivity(intent);
               break;
      ....
    }

通过 ACTION_DIAL启动到拨号盘,并把SpannableStringBuilder记录的字符串作为号码传入


3、拨号盘在Dialer中,DialpadFragment.java


onResume 调用-->configureScreenFromIntent(getActivity().getIntent())
-->fillDigitsIfNecessary(intent)-->setFormattedDigits


目录
相关文章
|
8月前
MFC -- 键盘全局HOOK
MFC -- 键盘全局HOOK
55 0
|
Android开发
Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public...
7717 0
|
8月前
LabVIEW以编程方式将VI控件值重置为默认值
LabVIEW以编程方式将VI控件值重置为默认值
423 2
|
3月前
flutter:定时器&通过key操作状态 (十二)
本文档介绍了Flutter中的定时器使用方法、通过key操作状态的几种方式,包括localKey和GlobalKey的使用场景与示例代码,以及如何处理屏幕旋转导致的组件状态丢失问题。通过配置全局key,可以有效地管理父子组件之间的状态交互,确保在屏幕旋转等情况下保持组件状态的一致性。
|
8月前
win32编程 -- 鼠标消息
win32编程 -- 鼠标消息
44 0
|
物联网
如何实现按键的短按、长按检测?
如何实现按键的短按、长按检测?
|
调度
按键演示休眠与唤醒场景--基于IMX6ULL
按键演示休眠与唤醒场景--基于IMX6ULL
162 0
按键演示休眠与唤醒场景--基于IMX6ULL
|
物联网 开发者
按键中断演示|学习笔记
快速学习按键中断演示
按键中断演示|学习笔记
|
JavaScript 开发者
组件切换-应用切换动画和 mode 方式|学习笔记
快速学习组件切换-应用切换动画和 mode 方式
129 0
组件切换-应用切换动画和 mode 方式|学习笔记
控制按键的 几种方法
控制按键的 几种方法
115 0

热门文章

最新文章