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