美文网首页
Dialer设置按键进入拨号盘--源码分析

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

作者: DD_Dog | 来源:发表于2022-06-24 19:06 被阅读0次

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

相关文章

网友评论

      本文标题:Dialer设置按键进入拨号盘--源码分析

      本文链接:https://www.haomeiwen.com/subject/rokbvrtx.html