Android 11 触摸小圆点显示流程

Android 11 触摸小圆点显示流程

在开发者选项中,打开 “显示点按操作反馈” 开关,当我们在触摸屏幕时,会显示一个小圆点,来分析下小圆点的显示流程。 操作这个开关时,其实就是操作Settings数据库中的 SHOW_TOUCHES

//packages\apps\Settings\src\com\android\settings\development\ShowTapsPreferenceController.java

@Override

public boolean onPreferenceChange(Preference preference, Object newValue) {

final boolean isEnabled = (Boolean) newValue;

Settings.System.putInt(mContext.getContentResolver(),

Settings.System.SHOW_TOUCHES, isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);

return true;

}

而在IMS中,会对 SHOW_TOUCHES 这个key进行监听

//frameworks\base\services\core\java\com\android\server\input\InputManagerService.java

private void registerShowTouchesSettingObserver() {

mContext.getContentResolver().registerContentObserver(

Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), true,

new ContentObserver(mHandler) {

@Override

public void onChange(boolean selfChange) {

updateShowTouchesFromSettings();

}

}, UserHandle.USER_ALL);

}

当SHOW_TOUCHES 这个key的值有改变时,调用updateShowTouchesFromSettings方法,在updateShowTouchesFromSettings方法中,是调用nativeSetShowTouches这个native方法,直接来看下这个方法

//frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp

static void nativeSetShowTouches(JNIEnv* /* env */,

jclass /* clazz */, jlong ptr, jboolean enabled) {

NativeInputManager* im = reinterpret_cast(ptr);

im->setShowTouches(enabled);//调用NativeInputManager的setShowTouches方法

}

void NativeInputManager::setShowTouches(bool enabled) {

{

// acquire lock

AutoMutex _l(mLock);

if (mLocked.showTouches == enabled) {

return;

}

ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");

mLocked.showTouches = enabled;//1

} // release lock

mInputManager->getReader()->requestRefreshConfiguration(

InputReaderConfiguration::CHANGE_SHOW_TOUCHES);//2

}

注释1处mLocked.showTouches就为传进来的enabled(打开为true,关闭为false),注释2处调用InputReader的requestRefreshConfiguration继续处理

//frameworks\native\services\inputflinger\reader\InputReader.cpp

void InputReader::requestRefreshConfiguration(uint32_t changes) {

AutoMutex _l(mLock);

if (changes) {

bool needWake = !mConfigurationChangesToRefresh;

mConfigurationChangesToRefresh |= changes;//changes为InputReaderConfiguration::CHANGE_SHOW_TOUCHES

if (needWake) {

mEventHub->wake();//唤醒InputReader线程

}

}

}

InputReader线程被唤醒,loopOnce继续执行

//frameworks\native\services\inputflinger\reader\InputReader.cpp

void InputReader::loopOnce() {

//省略

{

// acquire lock

AutoMutex _l(mLock);

uint32_t changes = mConfigurationChangesToRefresh;

if (changes) {

mConfigurationChangesToRefresh = 0;

timeoutMillis = 0;

refreshConfigurationLocked

黄金推荐

2018俄罗斯世界杯圆满落幕 金靴、金球、金手套奖各归其主
PHP生成静态页面的方法
足球365官网是哪个

PHP生成静态页面的方法

🕒 06-28 💰 2798
索罗亚什么性格最好
365bet体坛快讯

索罗亚什么性格最好

🕒 07-05 💰 9428