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
网友评论