美文网首页
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