当前位置:主页 > android教程 > Android CENTER键长按功能

Android O实现Framework层CENTER键长按功能方法

发布:2023-03-02 11:00:01 59


给大家整理了相关的编程文章,网友乜蕴涵根据主题投稿了本篇教程内容,涉及到Android、CENTER键长按功能、Android、O、Framework、Android CENTER键长按功能相关内容,已被564网友关注,涉猎到的知识点内容可以在下方电子书获得。

Android CENTER键长按功能

需求

设备有一个按键,我们定义为了 KEYCODE_DPAD_CENTER(23),长按 5s,实现系统自动重启。

原理

在 Framework 层,查找长按电源键关机相关逻辑,可以看到按键经过一堆处理之后会来到 (/frameworks/base/services/core/java/com/android/server/policy/)PhoneWindowManager.java 定义的 interceptKeyBeforeQueueing函数中,这里还需注意另一个函数为 interceptKeyBeforeDispatching,注意区别。在按键按下时延时5s发送特定消息,在收到消息时实现功能,在按键抬起时撤销延时发送的消息。下面直接说具体做法。

添加消息逻辑

首先定义一个属于自己的消息,可以看到,在 PhoneWindowManager.java 第820行附近,定义了一堆 private static final int MSG_XXXX = XX;,我们需要在最后这里添加一个自己的 private static final int MSG_MY_REBOOT = 999; 定义为999是为了避免与现有值重复。 接下来,在 handleMessage 方法中,添加该消息的处理:

private class PolicyHandler extends Handler {
	@Override
	public void handleMessage(Message msg) {
		switch (msg.what) {
			case MSG_ENABLE_POINTER_LOCATION:
				enablePointerLocation();
				break;
			// Add start
			case MSG_MY_REBOOT:
				mWindowManagerFuncs.reboot(false);
				break;
			// Add end ...
			// 省略若干行
		}
	}
}

这里直接调用了 mWindowManagerFuncsreboot 方法,传 false 进去,表现为不弹窗直接进入重启过程,显示“系统重启中”页面。传 true 进去,则弹窗提示将要关机,点是关机重启、点否取消。

添加按键处理

首先定义两个函数,分别进行 KeyDown 和 KeyUp 时的处理。这两个函数要写在 PhoneWindowManager 类中,注意不要写进了它的内部类里面,其实源码中包含很多类似的 interceptXxxKeyDown 方法,写到与他们并列的位置即可。

	// .....
	// Add start
	private void interceptCenterKeyDown() {
		Message msg = mHandler.obtainMessage(MSG_MY_REBOOT);
		msg.setAsynchronous(true);
		mHandler.sendMessageDelay(msg, 5000); // 5000ms = 5seconds	
	}
	private void interceptCenterKeyUp() {
		mHandler.removeMessages(MSG_MY_REBOOT);
	}
	// Add end
	private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
	// 省略若干行

调用按键处理

最后,在 interceptKeyBeforeQueueing 中添加对按键的拦截及处理调用

	@Override
	public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
		if (!mSystemBooted) {
			// If we have not yet booted, don't let key events do anything
			return 0;
		}
		final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0;
		// 省略若干行
		switch (keyCode) {
			case KeyEvent.KEYCODE_BACK: {
				if (down) {
					interceptBackKeyDown();
				} else {
					boolean handled = interceptBackKeyUp(event);
					// Don't pass back press to app if we've already handled it via long press
					if (handled) {
						result &= ~ACTION_PASS_TO_USER;
					}
				}
				break;
			}
			// Add start
			case KeyEvent.KEYCODE_DPAD_CENTER: {
				if (down) {
					interceptCenterKeyDown();
				} else {
					interceptCenterKeyUp();
				}
				break;
			}
			// Add end
			case KeyEvent.KEYCODE_VOLUME_DOWN:
			case KeyEvent.KEYCODE_VOLUME_UP:
			// 省略若干行
		}
	}

这里,因为在一般情况下,我们需要把这个按键消息发送给应用层,因此这里我们不进行 result &= ~ACTION_PASS_TO_USER 的操作。

这样,整个长按重启功能就实现了。

更多关于Android CENTER键长按功能的资料请关注码农之家其它相关文章!


参考资料

相关文章

  • JetPack Compose底部导航栏的实现方法详解

    发布:2023-03-06

    开发一个新项目,底部导航栏一般是首页的标配,在以前的xml布局中,我们可以很轻松的是用谷歌提供的BottomNavigationView或者自定义来实现底部导航的功能,在Compose中也有也提供了一个类似的控件androidx.compose.material.BottomNavigation


  • Android开发实现图片的上传下载

    发布:2023-03-09

    这篇文章主要为大家详细介绍了Android开发实现图片的上传下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Android Flutter实现自定义下拉刷新组件

    发布:2023-03-02

    在Flutter开发中官方提供了多平台的下拉刷新组件供开发者使用。本文将改造一下这些组件,实现自定义的下拉刷新组件,感兴趣的可以了解一下


  • Android AndFix热修复原理详情

    发布:2023-03-03

    这篇文章主要介绍了Android AndFix热修复原理详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值吗,需要的小伙伴可以参考一下


  • Android深入分析属性动画源码

    发布:2023-03-02

    这篇文章主要给大家介绍了关于Android动画系列教程之属性动画的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Android编辑框EditText与焦点变更监视器及文本变化监视器实现流程详解

    发布:2023-03-13

    这篇文章主要介绍了Android编辑框EditText与焦点变更监视器及文本变化监视器实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧


  • Android设备保证数据同步写入磁盘的步骤代码

    发布:2020-01-20

    这篇文章主要介绍了Android设备如何保证数据同步写入磁盘的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习


  • 如何将Android Studio卸载干净

    发布:2023-03-13

    这篇文章主要介绍了如何将Android Studio卸载干净,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下


网友讨论