Android 开发板接入外接USB键盘App重启问题
创始人
2024-02-29 00:38:19
0

关于插入部分无线鼠标Android应用重启问题

前言

在Android 9.0的项目中,测试工程师验证问题时插入某些USB的无线鼠标,会导致当前的APK会销毁然后重启一次,重新走一次生命周期。

Activity为啥会重启?

为什么会重启?

我们大概率的知道,一般App重启大致有如下原因:

  1. APP异常了(微信存在这样的问题,闪退重启)

机器状态改变了(比如改变语言),导致Activity重启了

不过,由于日志中没有异常日志,因此考虑后面一种情况。

下面是在《插入无线鼠标Android应用重启问题》

后面发现插入有问题的USB无线收发器,会生成2个设备,一个鼠标和一个键盘。没错,这是键鼠套装一体的无线收发器,正是这个键盘导致出现了现在的这个现象,而有些无线鼠标的无线收发器不是键鼠套装,所有只会有1个鼠标设备,所以插上去没有问题。

这里更加肯定了我的猜想[机器状态改变了(比如改变语音),导致Activity重启了]。

特意打印了一下Activity的生命周期的日志,发现Activity被销毁,然后重新启动了。

Android文档中有如下说明(前面《AndroidManifest.xml的configChanges配置简介》中也讲解过)

如果我们AndroidManifest.xml中的Activity中的android:configChanges申明了对应的属性,当属性改变时Activity不会重启且调用onConfigurationChanged()

因此解决,这个问题就是我们在AndroidManifest.xml中申明一下插入USB的无线鼠标后会改变的状态值即可。

但,我们不知道到底改变了哪一个值。为了验证,我们可以通过下面的方式做一下试验,然后找出幕后的凶手。

查找凶手

磨刀呼呼向猪羊。

第一步:AndroidManifest.xml的MainActivity的configChanges申明加入可能改变的状态

android:configChanges="orientation|uiMode|keyboard|keyboardHidden|fontScale|touchscreen|navigation|screenLayout|colorMode"

第二步:MainActivity中实现onConfigurationChanged,并添加如下打印。

 @Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);Log.d(TAG, "onConfigurationChanged              keyboard : " + newConfig.keyboard);Log.d(TAG, "onConfigurationChanged            densityDpi : " + newConfig.densityDpi);Log.d(TAG, "onConfigurationChanged             fontScale : " + newConfig.fontScale);Log.d(TAG, "onConfigurationChanged    hardKeyboardHidden : " + newConfig.hardKeyboardHidden);Log.d(TAG, "onConfigurationChanged        keyboardHidden : " + newConfig.keyboardHidden);Log.d(TAG, "onConfigurationChanged                   mcc : " + newConfig.mcc);Log.d(TAG, "onConfigurationChanged                   mnc : " + newConfig.mnc);Log.d(TAG, "onConfigurationChanged            navigation : " + newConfig.navigation);Log.d(TAG, "onConfigurationChanged      navigationHidden : " + newConfig.navigationHidden);Log.d(TAG, "onConfigurationChanged           orientation : " + newConfig.orientation);Log.d(TAG, "onConfigurationChanged        screenHeightDp : " + newConfig.screenHeightDp);Log.d(TAG, "onConfigurationChanged          screenLayout : " + newConfig.screenLayout);Log.d(TAG, "onConfigurationChanged smallestScreenWidthDp : " + newConfig.smallestScreenWidthDp);Log.d(TAG, "onConfigurationChanged           touchscreen : " + newConfig.touchscreen);Log.d(TAG, "onConfigurationChanged                uiMode : " + newConfig.uiMode);Log.d(TAG, "onConfigurationChanged                locale : " + newConfig.locale)

第三步:插拔USB无线收发器

下面是插拔的日志打印。

# 插入onConfigurationChanged              keyboard : 2onConfigurationChanged            densityDpi : 160onConfigurationChanged             fontScale : 1.0onConfigurationChanged    hardKeyboardHidden : 1onConfigurationChanged        keyboardHidden : 1onConfigurationChanged                   mcc : 460onConfigurationChanged                   mnc : 7onConfigurationChanged            navigation : 2onConfigurationChanged      navigationHidden : 1onConfigurationChanged           orientation : 2onConfigurationChanged        screenHeightDp : 670onConfigurationChanged          screenLayout : 268435812onConfigurationChanged smallestScreenWidthDp : 720onConfigurationChanged           touchscreen : 3onConfigurationChanged                uiMode : 17onConfigurationChanged                locale : zh_CN# 拔出onConfigurationChanged              keyboard : 1onConfigurationChanged            densityDpi : 160onConfigurationChanged             fontScale : 1.0onConfigurationChanged    hardKeyboardHidden : 2onConfigurationChanged        keyboardHidden : 1onConfigurationChanged                   mcc : 460onConfigurationChanged                   mnc : 7onConfigurationChanged            navigation : 1onConfigurationChanged      navigationHidden : 2onConfigurationChanged           orientation : 2onConfigurationChanged        screenHeightDp : 670onConfigurationChanged          screenLayout : 268435812onConfigurationChanged smallestScreenWidthDp : 720onConfigurationChanged           touchscreen : 3onConfigurationChanged                uiMode : 17onConfigurationChanged                locale : zh_CN

日志中出现navigation、navigationHidden、keyboard、hardKeyboardHidden几个的状态改变了。

解决方式

从上面日志中知道navigation、navigationHidden、keyboard、hardKeyboardHidden几个的状态发生了改变,加上我们没有配置这几个状态的监听,所以Activity被重启了一次。

因此,我们在AndroidManifest.xml中的Activity配置为如下:

android:configChanges="keyboard|navigation|keyboardHidden"

参考文章

  1. 《插入无线鼠标Android应用重启问题》
  2. 《onConfigurationChanged》
  3. 《AndroidManifest.xml的configChanges配置简介》

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...