连接/断开某些蓝牙耳机导致Activity页面重新绘制

   最近项目开发中遇见一个“看似闪退BUG”:测试人员一个偶然的机会,使用app连接/断开蓝牙耳机时,发现app竟然“闪退了”,而且还是必现的;让我一阵头大.....不过还好是必现的,我就去看崩溃日志,然而什么都没有发现....小声嘟囔“谷歌搞的什么玩意啊,真是什么坑都有......”

    最后经过测试发现不是所有耳机都会引发这个问题,只有某一款的Airpods(测试了三四种类型蓝牙耳机)才会引起这个BUG;而且日志中并不是什么没有,而是有当前Activity的生命周期日志输出 如下:

onPause()
onStop()
onDestroy()

onCreate()
onStart()
onResume()

 

   领导还说,怎么回事别人的抖音,虎牙,斗鱼怎么不会这样,就我们app.......内心慌的一批.............

   于是突然懵懂之中想到当Activity横竖屏切换时的表现,终于有点线索了(感谢天,感谢地)....

   连接/断开蓝牙耳机到底为什么会导致页面重新绘制,而且app退到Launcher桌面呢?

   那么我依葫芦画瓢,能否解决这个问题呢?

   于是找到了下面这些属性:

   

<attr name="configChanges">
        <!-- IMSI MCC已更改,即已检测到SIM,并更新了移动国家/地区代码。从Android O默认情况下,即使应用未在configChanges中指定mcc,我们也不会重新创建活动。如果应用程序想要重新创建活动,请在recreateOnConfigChanges中指定mcc -->
        <flag name="mcc" value="0x0001" />
        <!-- IMSI MNC已更改,即已检测到SIM,并更新了移动网络代码。从Android O默认情况下,即使应用未在configChanges中指定mnc,我们也不会重新创建活动。如果应用程序想要重新创建访问权限,请在recreateOnConfigChanges中指定mnc -->
        <flag name="mnc" value="0x0002" />
        <!-- 语言环境已更改,即用户选择了一种新的语言,应在其中显示文本 -->
        <flag name="locale" value="0x0004" />
        <!-- 触摸屏已更改。通常不应发生. -->
        <flag name="touchscreen" value="0x0008" />
        <!-- 键盘类型已更改,例如,用户已插入外部键盘. -->
        <flag name="keyboard" value="0x0010" />
        <!-- 键盘或导航的可访问性已更改,例如,用户已将键盘滑出以使其暴露。请注意,尽管名称如此,但它适用于所有辅助功能:键盘或导航. -->
        <flag name="keyboardHidden" value="0x0020" />
        <!-- 导航类型已更改。通常永远不会发生 -->
        <flag name="navigation" value="0x0040" />
        <!-- 屏幕方向已更改,即用户已旋转设备 -->
        <flag name="orientation" value="0x0080" />
        <!-- 屏幕布局已更改。这可能是由于激活了其他显示器引起的. -->
        <flag name="screenLayout" value="0x0100" />
        <!-- 全局用户界面模式已更改。例如,进入或离开汽车模式,夜间模式更改等。 -->
        <flag name="uiMode" value="0x0200" />
        <!--当前的可用屏幕尺寸已更改。如果应用程序的定位目标至少不是{@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2},则该活动将始终自行处理(更改不会导致重新启动)。这表示当前可用大小的更改,因此当用户在横向和纵向之间切换时也会更改 -->
        <flag name="screenSize" value="0x0400" />
        <!--物理屏幕尺寸已更改。如果应用程序的定位目标至少不是{@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2},则该活动将始终自行处理(更改不会导致重新启动)。这表示尺寸的变化而与方向无关,因此仅在实际物理屏幕尺寸已更改(例如切换到外部显示器)时才会更改。 -->
        <flag name="smallestScreenSize" value="0x0800" />
        <!-- 显示密度已更改。这可能是由于用户指定了不同的显示比例引起的,也可能是由于激活了不同的显示引起的。 -->
        <flag name="density" value="0x1000" />
        <!-- 布局方向已更改。例如,从LTR到RTL。 -->
        <flag name="layoutDirection" value="0x2000" />
        <!-- 屏幕的颜色模式已更改(色域或动态范围)。-->
        <flag name="colorMode" value="0x4000" />
        <!-- 字体缩放系数已更改,即用户选择了新的全局字体大小。 -->
        <flag name="fontScale" value="0x40000000" />
    </attr>

这么多属性怎么办,还可以组合使用,怎么办,怎么办?那个,小李,你来排列组合试试,我去上个厕所......赶快使出尿遁法,将其抛给小李,嗯,哈哈....

果然,经过一番艰难的尝试之后发现果然有两个属性缺一不可:

<style name="AppTheme">
    <item name="android:configChanges">navigation|keyboardHidden</item>
</style>

 

我欣慰的笑了,拍了拍小李肩膀,你很有耐力........

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值