作者oasis316 (阿良)
看板AndroidDev
标题Re: [问题] KeyEvent dispatch flow
时间Mon May 9 22:11:56 2011
今天终於会动作了,提供一点经验分享
在WindowManagerService.java中constructor
private WindowManagerService(Context context, PowerManagerService pm,
boolean haveInputMethods) {
...
mQueue = new KeyQ(); //产生新的KeyInputQueue
//InputDeviceReader Thread为对底层处理
mInputThread = new InputDispatcherThread();
...
mInputThread.start();
...
}
在InputDispatcherThread中做dispatchKey
发现 mKeyWaiter.waitForNextEventTarget回传mKeyWaiter.CONSUMED_EVENT_TOKEN
当中的findTargetWindow回传为mKeyWaiter.CONSUMED_EVENT_TOKEN
由findTargetWindow找到mPolicy.interceptKeyTi为回传true造成
千辛万苦找到Implement的地方为PhoneWindowManager.java的interceptKeyTi
interceptKeyTi中launchHomeFromHotKey做了mKeyguardMediator.isInputRestricted
判断true造成, mKeyguardMediator.isInputRestricted的
mUpdateMonitor.isDeviceProvisioned是最後元凶
原来它是setting database中的Settings.Secure.DEVICE_PROVISIONED值为0
之後找谷歌发现也有这个问题,因此自己测试两个可以work方案
1. 在adb shell中
cd /data/data/com.android.providers.settings/
sqlite3 settings.db
INSERT INTO secure (name, value) VALUES (‘device_provisioned’, 1);
2. 在Launcher的OnCreate中设定
Settings.Secure.putInt(getContentResolver(),Settings.Secure.DEVICE_PROVISIONED
,1);
※ 引述《oasis316 (阿良)》之铭言:
: 开发层: (应用/框架/库/核心)
: 应用/框架
: 问题:
: HOME 与 SEARCH key (Not touch button) 无反应
: 输入:
: 按下 HOME 或 SEARCH key
: 预期输出:
: 回到 Launcher activity 或是 开始 Search activity
: 错误输出:
: 无任何反应
: 说明:
: 各位先辈大家好,目前遇到某些key无法作用
: 想请教一下key dispatch的一些流程
: 目前trace到的情况是,从底层送过来的key经过keymap转换後的数值是正确的
: 我在Launcher的activity onKeyDown 印讯息,确认这两个key是没有讯息输出
: 在KeyinputQueue InputDeviceReader Thread 印讯息确认无作用的两个key
: 有产生了KeyEvent class 但是在KeyEvent dispatch method中印讯息是无输出
: 所以想请问一下KeyEvent的dispatch flow
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.115.93.73
1F:推 sorrel20567:虽然不太清楚是在做什麽,不过推个专业! 05/10 12:28
2F:→ tomap41017:推追问题专业!! 05/10 17:47
3F:推 blooker:DEVICE_PROVISIONED是判断device的有没有跑过setupwizard 05/31 01:12
4F:→ blooker:用过应该就变成1了吧 05/31 01:12
5F:→ blooker:我记得activitymanagerservice叫launcher起来的时候 05/31 01:13
6F:→ blooker:会先把一个叫做PROVISIONED的ap偷偷叫起来 05/31 01:13
7F:→ blooker:这个AP里面会去把DEVICE_PROVISIONED地值写成1 05/31 01:14