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

Android  2020年9月5日 pm6:27发布4年前 (2020)更新 城堡大人
107 0 0

前言

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,并添加如下打印。

    @Override
    public 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 : 2
 onConfigurationChanged            densityDpi : 160
 onConfigurationChanged             fontScale : 1.0
 onConfigurationChanged    hardKeyboardHidden : 1
 onConfigurationChanged        keyboardHidden : 1
 onConfigurationChanged                   mcc : 460
 onConfigurationChanged                   mnc : 7
 onConfigurationChanged            navigation : 2
 onConfigurationChanged      navigationHidden : 1
 onConfigurationChanged           orientation : 2
 onConfigurationChanged        screenHeightDp : 670
 onConfigurationChanged          screenLayout : 268435812
 onConfigurationChanged smallestScreenWidthDp : 720
 onConfigurationChanged           touchscreen : 3
 onConfigurationChanged                uiMode : 17
 onConfigurationChanged                locale : zh_CN

# 拔出
 onConfigurationChanged              keyboard : 1
 onConfigurationChanged            densityDpi : 160
 onConfigurationChanged             fontScale : 1.0
 onConfigurationChanged    hardKeyboardHidden : 2
 onConfigurationChanged        keyboardHidden : 1
 onConfigurationChanged                   mcc : 460
 onConfigurationChanged                   mnc : 7
 onConfigurationChanged            navigation : 1
 onConfigurationChanged      navigationHidden : 2
 onConfigurationChanged           orientation : 2
 onConfigurationChanged        screenHeightDp : 670
 onConfigurationChanged          screenLayout : 268435812
 onConfigurationChanged smallestScreenWidthDp : 720
 onConfigurationChanged           touchscreen : 3
 onConfigurationChanged                uiMode : 17
 onConfigurationChanged                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配置简介

 历史上的今天

  1. 2024: Kotlin集合简介(0条评论)
  2. 2023: Unable to make field(0条评论)
  3. 2022: C语言中的类型定义符typedef简单介绍(0条评论)
  4. 2022: Visual Studio 2017常用部分快捷键(0条评论)
  5. 2019: 巴金:灯(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

UTF-8下指定字节个数截断字符串

前言项目中存在需要截取字符串长度,比如仪表需要显示歌曲信息时,由于存在字节限制,因此传输时需要截取一部分。记录于此,方便自己查阅。正文本文使用了百度AI助手搜索的。需求UTF-8下长度超过50个字节的歌曲名需要截断。思路在Java中,如果你想要截取一个UTF-8编码的字符串,使其总...

Fragment生命周期的详情

最近在看Android 6.0 Settings的源码,Fragment在很多地方都在使用,因此今天有空就复习一下。一图胜千言,直接看图。(下图来源互联网)图1、Fragment图2、Activity上面是Fragment和Activity(这个很熟悉吧)各自的生命周期,他们有些相同之处...

ACTION_MEDIA_BUTTON监听的几种方式记录

前言记录一下,MEDIA_BUTTON监听,用来控制多媒体的上下曲,播放暂停等正文隐藏内容!付费阅读后才能查看!¥3多个隐藏块只需支付一次付费阅读参考文章该文章太久了,忘记出处了,抱歉。

Android关闭selinux

前言简单记录一下关闭SELinux的命令或代码。正文获取SELinux状态adb shell getenforce返回值有两个Permissive //关闭了SELinux​Enforcing //打开了SELinux临时方法前提设备已root了哈临时的话,就是用adb来...

[摘]Android开发之Shape详细解读

这篇文章总结得很详细,因此摘抄于此,以便自己查询和学习。原文如下日常开发中,我们会遇到一些Button、Textview...等控件的背景是圆角矩形、圆形...等,和android默认的控件背景矩形不一致,此时shape的作用就体现出来了,我们可以根据shape属性画出很多我们意想不到的背景图...

胡适:赠与今年的大学毕业生

这一两个星期里,各地的大学都有毕业的班次,都有很多的毕业生离开学校去开始他们的成人事业。学生的生活是一种享有特殊优待的生活,不妨幼稚一点,不妨吵吵闹闹,社会都能纵容他们,不肯严格的要他们负行为的责任。现在他们要撑起自己的肩膀来挑他们自己的担子了。在这个国难最紧急的年头,他们的担子真不轻! 我们祝他们...