关于插入部分无线鼠标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配置简介》

Android 开发板接入外接USB键盘App重启问题相关推荐

  1. Android开发板

    由于公司要做智能自助设备,因此需要在Android开发板上开发,记录一下经验 一.Android开发板应用 Android开发板应用: 商业应用:机顶盒.广告机,自助机,售卖机,多媒体教学,人脸识别, ...

  2. Android开发板串口(SerialPort)通信

    Android开发板串口(SerialPort)通信 Roy88关注 22017.09.07 18:01:22字数 1,618阅读 28,511 前言: 最近在总是看见有人在群里面问一些串口通信相关的 ...

  3. Android开发板 MTK 4g/5g 安卓开发板定制

    厂商:深圳新移科技 公司介绍:专业提供 4G.5G 安卓核心板 / 开发板.物联网方案.整机定制开发生产 一.Android 开发板应用: 商业应用:安防监控,图像识别设备,4G 音视频传输,智能手持 ...

  4. 【测评】迅为4418/6818开发板安卓Android开发板

    拿到开发板暂时按手册测试了以下功能,性能确实不错,没有卡顿现象,更多功能有待测试... Android开发板 Android开发板基本功能介绍 1.开机 开发板接通电源,并按下电源开关,系统即启动,在 ...

  5. Android开发板开发总结

    ADB常见命令 adb connect ip[:port]:连接Android开发板(要求开发板开启ADB服务) adb disconnect ip:断开与Android开发板的连接 adb shel ...

  6. Android开发板之串口开发

    Android开发板之串口开发 简介 首先描述一下我的应用项目,它是一个简单的智能盒子,主要内容:是通过Android开发板上的串口进行数据的读取操作,一块android开发板外接一个Arduino, ...

  7. Android 如何在插入外接物理键盘时还能显示软键盘

    参考地址:http://blog.csdn.net/wq892373445/article/details/51767022 http://blog.csdn.net/qq_32034593/arti ...

  8. android开发板只有网口和串口如何使用android studio进行调试

    android开发板只有网口和串口如何使用android studio进行调试 1.要先准备一条串口线,或者串口转usb的线,用于在pc端与开发板端建立连接. 2.要下载一个在pc端运行的超级终端,我 ...

  9. 在Android开发板跑一个LED驱动的历程(个人笔记)

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 在Android开发板跑一个LED驱动的历程(个人笔记) 1. 板子端, 放置驱动程序 1.1 编写一个驱动程序 驱动程序的编写上, ...

最新文章

  1. 解决掉这些痛点和难点,让知识图谱不再是“噱头”
  2. python下载网页里面所有的图片-Python批量下载网页图片详细教程
  3. YOLOv2和YOLOv3效果对比
  4. 副族元素从上到下原子半径_长知识:化学元素大阅兵
  5. 个人博客网站的设计与实现_新手建立个人博客网站后如何提高回访率?
  6. 浅析call和apply的不同
  7. Ubuntu kylin 14.04 LTS上安装opencv
  8. 工业以太网交换机选机攻略
  9. suse linux增加新磁盘分区,Virtualbox中Linux添加新磁盘并创建分区
  10. 点击率预测的贝叶斯平滑
  11. Angular Extends
  12. 转载—android 媒体库数据更新解决办法总结
  13. HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)
  14. pdf合并页面大小不一样
  15. 尽管凭借主持人的身份成名,张绍刚先生在内心深处却对这一角色认可度很低
  16. Ecowalker充气足球门,为青少年足球训练保驾护航!
  17. Vue el-input 使用伪元素插入间隔符
  18. 字符串模板和dom模板的区别
  19. Free Code Camp 练习总结(五) ——Introduction to the ES6 Challenges ES6基本用法和基础知识
  20. php开发使用predis(thinkphp框架,composer,windows环境练习)

热门文章

  1. 微博开放平台接口整理系列--短链转长链
  2. 8 puzzle问题
  3. redshift mysql_使用Python迁移redshift mysql
  4. 深圳市京华达物流有限公司发布跨境物流中美专线—US鹰派
  5. 样本方差是总体方差的无偏估计
  6. WF曲速未来消息:Cobalt黑客组织在俄罗斯和罗马尼亚测试银行
  7. 魔兽争霸微操教学(精华篇)
  8. 微信小程序安卓机型调用微信支付后取消付款会重新调用一次页面的onShow方法
  9. 企业注销后工伤认定书要如何认定
  10. Command Injection命令注入攻击