android 设置界面10秒无操作退休,关于Android系统无用户操作相关处理
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
最近开发产品遇到一个需求:当Android系统若干时间内无用户操作响应时启动多媒体轮播应用。
####思路1:监听输入事件并对其处理
接到需求想到的一个土办法就是在android系统input事件响应端对相关输入事件进行处理,可以追溯到android系统输入事件的framework层处理,相关代码目录在frameworks/base/core/java/android/view下,
我起初的处理在在ViewRootImpl.java,读者如果对Android输入系统不熟悉的话,最好可以去了解下,这里我就不进行拓展。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23final class extends InputEventReceiver{
public (InputChannel inputChannel, Looper looper){
super(inputChannel, looper);
}
public void onInputEvent(InputEvent event){
Log.d(TAG ,"onInputEvent:"+event.toString());
enqueueInputEvent(event, this, 0, true);
}
public void onBatchedInputEventPending(){
scheduleConsumeBatchedInput();
}
public void dispose(){
unscheduleConsumeBatchedInput();
super.dispose();
}
}
在WindowInputEventReceiver这个类里面会接收到输入系统输入的各种事件,包括用户的触摸,遥控 ,鼠标操作,当有输入时候,WindowInputEventReceiver的onInputEvent()就会响应,这时候就知道系统有用户在操作了,那么你可以在这个函数里对产生输入事件的时间进行统计和运算,用户多久操作多久没操作你都清楚啦,你可以在这里通过广播或者其他途径告诉上层应用去做响应的处理,到此可以完成需求了。
####思路2:利用Android系统原有的休眠机制
Android系统本身是有无操作若干时间后自动休眠的功能,一般在设置程序中的显示这项中找到休眠一项,这里就直接给出相关的代码,实际上这里只是设置了一个SCREEN_OFF_TIMEOUT关键字的数据库字段,相关代码在设置程序的DisplaySettings中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public boolean onPreferenceChange(Preference preference, Object objValue){
final String key = preference.getKey();
if (KEY_SCREEN_TIMEOUT.equals(key)) {
int value = Integer.parseInt((String) objValue);
try {
//设置
Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);
updateTimeoutPreferenceDescription(value);
} catch (NumberFormatException e) {
Log.e(TAG, "could not persist screen timeout setting", e);
}
}
if (KEY_FONT_SIZE.equals(key)) {
writeFontSizePreference(objValue);
}
return true;
}
那么实际上的操作处理在哪里呢,经过一段搜索后(搜索SCREEN_OFF_TIMEOUT关键字),我们发现是在PowerManagerService中查找到相关的处理,因为休眠部分涉及到电源管理,读者对这部分有疑问,建议去读下关于PowerManagerService的相关分析,在这里介绍调用到PowerManagerService里关键的方法updateUserActivitySummaryLocked()。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62/**
* Updates the value of mUserActivitySummary to summarize the user requested
* state of the system such as whether the screen should be bright or dim.
* Note that user activity is ignored when the system is asleep.
*
* This function must have no other side-effects.
*/
private long mLastUserActivityTimeRecord =0;
private void updateUserActivitySummaryLocked(long now, int dirty){
Slog.d(TAG, "updateUserActivitySummaryLocked:"+now
+"mLastUserActivityTime:"+mLastUserActivityTime
+"mLastWakeTime:"+mLastWakeTime);
// Update the status of the user activity timeout timer.
if ((dirty & (DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
long nextTimeout = 0;
if (mWakefulness != WAKEFULNESS_ASLEEP) {
final int screenOffTimeout = getScreenOffTimeoutLocked();
final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
mUserActivitySummary = 0;
if (mLastUserActivityTime >= mLastWakeTime) {
nextTimeout = mLastUserActivityTime
+ screenOffTimeout - screenDimDuration;
if (now < nextTimeout) {
mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
} else {
nextTimeout = mLastUserActivityTime + screenOffTimeout;
if (now < nextTimeout) {
mUserActivitySummary |= USER_ACTIVITY_SCREEN_DIM;
}
}
}
if (mUserActivitySummary == 0
&& mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
if (now < nextTimeout
&& mDisplayPowerRequest.screenState
!= DisplayPowerRequest.SCREEN_STATE_OFF) {
mUserActivitySummary = mDisplayPowerRequest.screenState
== DisplayPowerRequest.SCREEN_STATE_BRIGHT ?
USER_ACTIVITY_SCREEN_BRIGHT : USER_ACTIVITY_SCREEN_DIM;
}
}
if (mUserActivitySummary != 0) {
Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, nextTimeout);
}
} else {
mUserActivitySummary = 0;
}
if (DEBUG_SPEW) {
Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness="
+ wakefulnessToString(mWakefulness)
+ ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
+ ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout));
}
}
}
读者可以仔细读下这个部分的注释,大概意思是通过这个办法统计更新用户请求的一些信息和状态,通过打印发现这个方法在若干毫秒被系统调用的(具体的回调过程我还没仔细研究);需要注意的是这里有声明该方法内不能有其他副作用的操作,言下之意不能过多的操作不然系统会崩溃重启。这里我吃过苦头了,反复发一个intent也会导致系统重启,各位看官如果要操作之记得慎重操作。
需要注意的变量now,mLastUserActivityTime,now是通过SystemClock.uptimeMillis()获取,表示当前时间,mLastUserActivityTime表示用户上一次操作的时间,now和mLastUserActivityTime的对比可以知道距离用户上一次多久没有操作了。通过大家可以研读其中逻辑打印体会下。只要搞定了这个地方,可以满足目前的需求,而且不用单独去输入系统去做处理,这里的需求推荐思路2去实现。
android 设置界面10秒无操作退休,关于Android系统无用户操作相关处理相关推荐
- Xamarin Android设置界面提示类型错误
Xamarin Android设置界面提示类型错误 错误信息:Integer types not allow (at 'padding' with value '10') Android界面属性的长度 ...
- Android设置状态栏颜色,沉浸式状态栏 fllutter Android设置沉浸式状态栏
1. Android原生设置沉浸式状态栏,设置状态栏颜色,字体颜色 import android.annotation.TargetApi; import android.app.Activity; ...
- Android设置EditText输入类型:setInputType()方法和android:inputType属性
需求: 本次需求是做密码输入的隐藏.显示. 过程: 时间太久,很多属性已经记不太清楚了,比较纠结,所以整合下属性. 结果: 布局文件------------------------------ < ...
- android 断电自动关机,Android 断开电源10秒后自动关机
最近在做行车记录仪的事情,由于车载设备上的锂电池容量比较小,所以在停车熄火,保存数据后需要自动关机,由于Shutdown的权限不对普通应用开放,所以需要在源码下编译代码.可以自己写个Broadcast ...
- Android 设置界面的圆角选项
请先看一个图: 像这种界面的设计,其实是这样的:整体为一个LinearLayout,一个一个排下去,每一个点击项都是一个RelativeLayout(要为其设置clickable为true),分为左右 ...
- miui10.0.4 android p,小米10稳定版刷机包(系统刷机官方最新固件升级包MIUIV12.0.4.0)...
小米10搭载高通骁龙865处理器,后置1亿像素AI四摄,搭载4780mAh电池,支持30W有线快充,搭载MIUI 11系统,最近已经可以更新升级MIUI12了,小编第一时间和大家分享,可通过本页面下载 ...
- android设置为默认短信应用,如何在Android上设置默认短信应用 | MOS86
与iOS不同,Android允许您使用第三方应用来执行基本功能,例如发短信. 这是您可以在Android手机上设置新的默认短信应用的方法. 首先,您需要安装要使用的替换短信应用程序. Play商店上有 ...
- Android 点击跳转到蓝牙设置界面
点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...
本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...
最新文章
- Windows/Linux上使用fopen相关函数读取大文件
- 背包问题之我的思考一
- UML类图中的各种箭头代表的含义(转自:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html)
- vscode could not establish connection to linux The VS Code Server failed to start
- 关Jquery判断input type=checkbox元素是否被选中的判断
- 经典实战案例:用机器学习 KNN 算法实现手写数字识别 | 原力计划
- 高达 800 万次下载量的 npm 包被黑客篡改了代码,你的设备或正成为挖矿机
- javascript如何处理多级的实时监听
- AR技术介绍(Located in Android)
- python笔记(1)安装调试
- 为程序使用内存缓存(MemoryCache)
- BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
- Java实现HTML代码生成PDF文档
- SharePoint CAML Query小结
- 因果推断英文书单整理及简介
- 7-3 将整数转换为汉字大写数字
- 22-05-21 西安 javaweb(07) HttpServletRequest和HttpServletResponse、转发与重定向、web应用的路径问题、解决中文乱码问题
- 解决PPT不能插入页码问题
- flutter widget super(key: key)的作用(五)
- 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享
热门文章
- 《Linux下使用Docker部署Web项目》
- idea git解决冲突,绝对经典
- 计算机用户无法加载配置文件,““用户配置文件服务登录失败。无法加载用户配置文件””的解决方案...
- C++实现Delaunay三角网生长算法
- 极客日报第 64 期:抖音否认封杀腾讯;程序员拒绝带电脑回家被开除,获赔 19.4 万;微软称 Excel 是编程语言
- 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-07-28)...
- 详解小红书引流小技巧和矩阵玩法
- SpringMVC与Struts2等MVC控制器
- 二进制负数的反码补码
- 量化投资界领头羊-明汯投资