Android入门之WmS中处理消息的时机

        用户消息可分为两类,一类是Key消息,另一类是Motion消息。在Android2.3版本的消息系统设计中,对于Motion消息,InputDispatcher会使用pipe直接把消息发往客户窗口,WmS类不能对这些消息进行任何的前置(pre)处理,而对于Key消息,则会首先回调WmS中的Key消息处理函数,在WmS中不处理该消息时,才把消息发往客户窗口中。在一般情况下,WmS中仅处理一些系统Key消息,比如“Home”键、照相按键、声音按键等。

        在WmS中注册服务通道时,调用Java环境中的InputManager对象mInputManager,而该类的构造函数中创建了一个Callbacks子类对象,并赋值给InputManager中的mCallbacks变量,然后在init()函数中调用nativeInit(mCallbacks)进行了初始化。变量mCallbacks作为初始化的参数传递到native环境中的InputManager对象中,从而使得在InputDispatcher进行回调时首先回调到Java环境的InputManager.Callbacks子类中。

        以下是WmS的构造函数:

private WindowManagerService(Context context, PowerManagerService pm,
		boolean haveInputMethods) {
	mContext = context;
	mHaveInputMethods = haveInputMethods;
	mLimitedAlphaCompositing = context.getResources().getBoolean(
			com.android.internal.R.bool.config_sf_limitedAlpha);

	mPowerManager = pm;
	mPowerManager.setPolicy(mPolicy);
	PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
	mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
			"SCREEN_FROZEN");
	mScreenFrozenLock.setReferenceCounted(false);

	mActivityManager = ActivityManagerNative.getDefault();
	mBatteryStats = BatteryStatsService.getService();

	// Get persisted window scale setting
	mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
			Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
	mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
			Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);

	// Track changes to DevicePolicyManager state so we can enable/disable keyguard.
	IntentFilter filter = new IntentFilter();
	filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
	mContext.registerReceiver(mBroadcastReceiver, filter);

	mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
			"KEEP_SCREEN_ON_FLAG");
	mHoldingScreenWakeLock.setReferenceCounted(false);

	<span style="color:#ff0000;">mInputManager = new InputManager(context, this);</span>

	PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
	thr.start();

	synchronized (thr) {
		while (!thr.mRunning) {
			try {
				thr.wait();
			} catch (InterruptedException e) {
			}
		}
	}

	mInputManager.start();

	// Add ourself to the Watchdog monitors.
	Watchdog.getInstance().addMonitor(this);
}

        InputManager在此处被创建:mInputManager = new InputManager(context, this)。

        InputManager的构造子创建了Callbacks:

public InputManager(Context context, WindowManagerService windowManagerService) {
	this.mContext = context;
	this.mWindowManagerService = windowManagerService;
	
	this.mCallbacks = new Callbacks();
	
	init();
}

private void init() {
	Slog.i(TAG, "Initializing input manager");
	nativeInit(mCallbacks);
}

        com_android_server_InputManager.cpp中使用callbacks创建了NativeInputManager对象:

static void android_server_InputManager_nativeInit(JNIEnv* env, jclass clazz,
        jobject callbacks) {
    if (gNativeInputManager == NULL) {
        gNativeInputManager = new NativeInputManager(callbacks);
    } else {
        LOGE("Input manager already initialized.");
        jniThrowRuntimeException(env, "Input manager already initialized.");
    }
}

        NativeInputManager的构造子保存了callbacks对象:

NativeInputManager::NativeInputManager(jobject callbacksObj) :
    mFilterTouchEvents(-1), mFilterJumpyTouchEvents(-1), mVirtualKeyQuietTime(-1),
    mMaxEventsPerSecond(-1),
    mDisplayWidth(-1), mDisplayHeight(-1), mDisplayOrientation(ROTATION_0) {
    JNIEnv* env = jniEnv();

    mCallbacksObj = env->NewGlobalRef(callbacksObj);

    sp<EventHub> eventHub = new EventHub();
    mInputManager = new InputManager(eventHub, this, this);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值