http://blog.csdn.net/drakeblue/article/details/39049495
android系統在外接實體鍵盤的時候,可以在settings的language&input設定中,将預設的輸入設定設為軟鍵盤還是實體鍵盤。
android系統在檢測到有外接usb鍵盤的時候,預設是啟用實體鍵盤,而軟鍵盤将會隐藏。如果需要啟用軟鍵盤,需要将實體鍵盤off掉。
現在,我們修改源代碼,将這個實體鍵盤預設改為off。
通過settings的代碼,我們找到該dialog是通過iiputmethodmanager.aidl的showinputmethodpickerfromclient()方法通知另外的地方彈出的對話。
而showinputmethodpickerfromclient()方法的實作是在frameworks/base/services/java/com/android/server/inputmethodmanagerservice.java中。
1795行,方法//
@override
public void showinputmethodpickerfromclient(iinputmethodclient client) {
synchronized (mmethodmap) {
if (mcurclient == null || client == null
|| mcurclient.client.asbinder() != client.asbinder()) {
slog.w(tag, "ignoring showinputmethodpickerfromclient of uid "
+ binder.getcallinguid() + ": " + client);
}
// always call subtype picker, because subtype picker is a superset of input method
// picker.
mhandler.sendemptymessage(msg_show_im_subtype_picker);
}
}
該handler的處理在2050行;
public boolean handlemessage(message msg) {
handlercaller.someargs args;
switch (msg.what) {
case msg_show_im_picker:
showinputmethodmenu();
return true;
case msg_show_im_subtype_picker:
showinputmethodsubtypemenu();
......
繼續跟蹤showinputmethodsubtypemenu()方法; 2317行
private void showinputmethodsubtypemenu() {
showinputmethodmenuinternal(true);
最後找到關鍵方法showinputmethodmenuinternal(); 2344行;
這個方法主要是擷取系統輸入法,然後進行彈框顯示。而我們的實體鍵盤預設設定看在下面代碼片段中。
final switch hardkeyswitch = ((switch)mswitchingdialogtitleview.findviewbyid(
com.android.internal.r.id.hard_keyboard_switch));
log.d(tag, "input isenabled: " + mwindowmanagerservice.ishardkeyboardenabled());
hardkeyswitch.setchecked(mwindowmanagerservice.ishardkeyboardenabled());
hardkeyswitch.setoncheckedchangelistener(
new oncheckedchangelistener() {
@override
public void oncheckedchanged(
compoundbutton buttonview, boolean ischecked) {
mwindowmanagerservice.sethardkeyboardenabled(ischecked);
}
});
我們看到該switch的checked設定是在調用的windowmanagerservice的一個boolean值的get方法。接着往裡走
/frameworks/base/services/java/com/android/server/wm/windowmanagerservice.java
關鍵代碼:行6618 computescreenconfigurationlocked()方法中
boolean hardkeyboardavailable = config.keyboard != configuration.keyboard_nokeys;
if (hardkeyboardavailable != mhardkeyboardavailable) {
mhardkeyboardavailable = hardkeyboardavailable;
mhardkeyboardenabled = !hardkeyboardavailable;
mh.removemessages(h.report_hard_keyboard_status_change);
mh.sendemptymessage(h.report_hard_keyboard_status_change);
if (!mhardkeyboardenabled) {
config.keyboard = configuration.keyboard_nokeys;
這裡将會讀取實體鍵盤是否可用,如果可用将會指派給mhardkeyboardenabled為true,然後hardkeyswitch set的值将會是這個可用的true,
我這裡将hardkeyboardavailable取反賦給mhardkeyboardenabled。