Android O实现Framework层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键长按功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android中实现长按照片弹出右键菜单功能的实例代码

    场景效果 注: 实现 将布局改为LinearLayout,并通过android:orientation="vertical">设置为垂直布局. 然后添加一个ImageView,并设置id属性和图片源. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr

  • Android仿微信长按录制视频并播放功能

    本文实例为大家分享了Android仿微信长按录制视频并播放功能的具体代码,供大家参考,具体内容如下 一.点击按钮进行录制 首先要获取摄像拍照的权限和读取权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <use

  • Android实现长按圆环动画View效果的思路代码

    一.需求来源 最近想到一个需求,类似悦跑圈或者Keep的结束按钮动画 二.思路代码 该动画按钮的主要作用就是防止用户误操作,具体实现思路如下: 1.监听用户的触摸事件OnTouchListener,在ACTION_DOWN的时候,记录下xy坐标和触摸时间,同时start自定义View动画:在ACTION_MOVE的过程中,判断坐标差值的偏移量是否在一个可接受的范围内,是的话就保留当前动画,不是的话就清除按钮上绘制的path:在ACTION_UP的时候,再次记录下触摸时间,比较两个时间是否达到了长

  • Android组件ContextMenu实现长按事件

    本文实例为大家分享了ContextMenu长按事件的实现具体代码,供大家参考,具体内容如下 /** *ContextMenu菜单就是长按某一个组件,就会在屏幕的中间弹出ContextMenu,这里设置为长按文本框弹出 *ContextMenu菜单 */ public class MyContextMenu extends AppCompatActivity { /** *Called when the activity is first created. **/ final static int

  • 安卓(Android) 监听按键长按事件

    1,key -- 实体按键 现在手机物理按键越来越少 常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU 在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event): public boolean onKeyUp(int keyCode, KeyEvent event): p

  • Android自定义带有圆形进度条的可长按控件功能

    这几天有在学习Jetpack中CameraX的内容,在拍摄视频的时候想着做一个自定义带有进度条的可长按控件,用来显示拍摄进度,故记录下来与大家分享!效果如下: (篇幅过长是因为有代码解析过程,可直接到最后查看完整代码) 这个控件较为简易,从效果中可以看出,控件模拟了单击拍照,长按可以录制视频的功能,中途松手或者时间到都可以停止录制 思路很简单,使用简单的画笔工具就可以完成这个控件 继承自View 定义自定义属性并获取 定义填充样式的画笔 onMeasure中测量大小,onDraw中绘制圆与扇形

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

    目录 需求 原理 添加消息逻辑 添加按键处理 调用按键处理 需求 设备有一个按键,我们定义为了 KEYCODE_DPAD_CENTER(23),长按 5s,实现系统自动重启. 原理 在 Framework 层,查找长按电源键关机相关逻辑,可以看到按键经过一堆处理之后会来到 (/frameworks/base/services/core/java/com/android/server/policy/)PhoneWindowManager.java 定义的 interceptKeyBeforeQue

  • Android Framework Application Framework层简单介绍

    引言 Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我们业务上的需求.写APP的人都知道,学习Android开发的第一步就是去学习各种各样的API,什么Activity,Service,Notification等.这些都是framework提供

  • Android Framework层获取及处理按键事件流程

    目录 前言 一.EventHub的getEvents() 二.InputReader的processEventsLocked() 前言 Android系统的输入事件是由InputManagerService服务来监控的,该系统服务在SystemServer的startOtherServices()中初始化.初始化的过程中会在Native层创建InputReaderThread和InputDispatcherThread两个线程,InputReaderThread的主要工作是读取输入事件,然后将输

  • Android设备上非root的抓包实现方法(Tcpdump方法)

    通常我们在Android应用中执行某个命令时会使用"Runtime.getRuntime().exec("命令路径")"这种方式,但是当我们执行抓包操作时,使用这条命令无论如何都不行,通过下面代码打印结果发现,该命令一定要在root权限下才能执行. BufferedReader brW = new BufferedReader(new InputStreamReader(p.getErrorStream())); while((str = brW.readLine(

  • Android中监听Home键的4种方法总结

    昨天需要处理一个问题,需要监听home键.最开始想到使用onKeydonwn这个方法.但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能.因为home键是系统键,情况特殊一些. 看了一下网上的资料,说下面的方法可以.(其实不行) 复制代码 代码如下: @Override     public void onAttachedToWindow() {         // TODO Auto-generated method stub         Log

  • Android 实现圆圈扩散水波动画效果两种方法

    两种方式实现类似水波扩散效果,先上图为敬 自定义view实现 动画实现 自定义view实现 思路分析:通过canvas画圆,每次改变圆半径和透明度,当半径达到一定程度,再次从中心开始绘圆,达到不同层级的效果,通过不断绘制达到view扩散效果 private Paint centerPaint; //中心圆paint private int radius = 100; //中心圆半径 private Paint spreadPaint; //扩散圆paint private float cente

  • JS实现点击文字对应DIV层不停闪动效果的方法

    本文实例讲述了JS实现点击文字对应DIV层不停闪动效果的方法.分享给大家供大家参考.具体分析如下: 在很多娱乐网站我们经常看到这种效果,点击网页中某个方块中的文字,然后整个方块就不停的闪动起来,很不错的一个动态效果,容易引起顾客的注意,这个代码就是实现了这个效果,点击某个方块后,方块就会闪动 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o

  • Android中控件GridView实现设置行列分割线的方法示例

    前言 虽然Aandroid目前已经有RecyclerView了.非常强大的一个View.可以直接控制成ListView以及GridView等.而且画框线也比较方便.但是呢在很多情况下我们不得不仍然使用GridView来实现布局.那么在这个时候我们又要怎么来对GridViw进行画框线呢.下面将提供两种实现方式.大家可以选择一下 一.设置垂直.横向间距.通过GRIDVIEW和ITEM的背景色来实现 1.设置GridView背景色 2.设置水平和竖直方向间隔:android:horizontalSpa

  • Android实现文件上传和下载倒计时功能的圆形进度条

    screenshot 截图展示 import step1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step2. Add the dependency dependencies { compile 'com.github.yanjiabin:ExtendsRingPrigr

  • Android开发中Listview动态加载数据的方法示例

    本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

随机推荐