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系统无用户操作相关处理相关推荐

  1. Xamarin Android设置界面提示类型错误

    Xamarin Android设置界面提示类型错误 错误信息:Integer types not allow (at 'padding' with value '10') Android界面属性的长度 ...

  2. Android设置状态栏颜色,沉浸式状态栏 fllutter Android设置沉浸式状态栏

    1. Android原生设置沉浸式状态栏,设置状态栏颜色,字体颜色 import android.annotation.TargetApi; import android.app.Activity; ...

  3. Android设置EditText输入类型:setInputType()方法和android:inputType属性

    需求: 本次需求是做密码输入的隐藏.显示. 过程: 时间太久,很多属性已经记不太清楚了,比较纠结,所以整合下属性. 结果: 布局文件------------------------------ < ...

  4. android 断电自动关机,Android 断开电源10秒后自动关机

    最近在做行车记录仪的事情,由于车载设备上的锂电池容量比较小,所以在停车熄火,保存数据后需要自动关机,由于Shutdown的权限不对普通应用开放,所以需要在源码下编译代码.可以自己写个Broadcast ...

  5. Android 设置界面的圆角选项

    请先看一个图: 像这种界面的设计,其实是这样的:整体为一个LinearLayout,一个一个排下去,每一个点击项都是一个RelativeLayout(要为其设置clickable为true),分为左右 ...

  6. miui10.0.4 android p,小米10稳定版刷机包(系统刷机官方最新固件升级包MIUIV12.0.4.0)...

    小米10搭载高通骁龙865处理器,后置1亿像素AI四摄,搭载4780mAh电池,支持30W有线快充,搭载MIUI 11系统,最近已经可以更新升级MIUI12了,小编第一时间和大家分享,可通过本页面下载 ...

  7. android设置为默认短信应用,如何在Android上设置默认短信应用 | MOS86

    与iOS不同,Android允许您使用第三方应用来执行基本功能,例如发短信. 这是您可以在Android手机上设置新的默认短信应用的方法. 首先,您需要安装要使用的替换短信应用程序. Play商店上有 ...

  8. Android 点击跳转到蓝牙设置界面

    点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  9. android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...

最新文章

  1. Windows/Linux上使用fopen相关函数读取大文件
  2. 背包问题之我的思考一
  3. UML类图中的各种箭头代表的含义(转自:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html)
  4. vscode could not establish connection to linux The VS Code Server failed to start
  5. 关Jquery判断input type=checkbox元素是否被选中的判断
  6. 经典实战案例:用机器学习 KNN 算法实现手写数字识别 | 原力计划
  7. 高达 800 万次下载量的 npm 包被黑客篡改了代码,你的设备或正成为挖矿机
  8. javascript如何处理多级的实时监听
  9. AR技术介绍(Located in Android)
  10. python笔记(1)安装调试
  11. 为程序使用内存缓存(MemoryCache)
  12. BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
  13. Java实现HTML代码生成PDF文档
  14. SharePoint CAML Query小结
  15. 因果推断英文书单整理及简介
  16. 7-3 将整数转换为汉字大写数字
  17. 22-05-21 西安 javaweb(07) HttpServletRequest和HttpServletResponse、转发与重定向、web应用的路径问题、解决中文乱码问题
  18. 解决PPT不能插入页码问题
  19. flutter widget super(key: key)的作用(五)
  20. 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享

热门文章

  1. 《Linux下使用Docker部署Web项目》
  2. idea git解决冲突,绝对经典
  3. 计算机用户无法加载配置文件,““用户配置文件服务登录失败。无法加载用户配置文件””的解决方案...
  4. C++实现Delaunay三角网生长算法
  5. 极客日报第 64 期:抖音否认封杀腾讯;程序员拒绝带电脑回家被开除,获赔 19.4 万;微软称 Excel 是编程语言
  6. 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-07-28)...
  7. 详解小红书引流小技巧和矩阵玩法
  8. SpringMVC与Struts2等MVC控制器
  9. 二进制负数的反码补码
  10. 量化投资界领头羊-明汯投资