Android 10.0 &&Android 11插入usb设备之后导致应用重启
前言
在进行Frameworks开发过程中遇到需要客户app ,发现在插入usb无线鼠标时,会导致应用秒退退出重进的问题。最终经过查阅博客发现是,Android程序在运行时,一些设备的配置可能会改变,如:横竖屏的切换、键盘的可用性等。这些事件一旦发生,当前活动的Activity会重新启动。
一、configChanges作用
Android程序在运行时,一些设备的配置可能会改变,如:横竖屏的切换、键盘的可用性等。这些事件一旦发生,当前活动的Activity会重新启动,其中的过程是:在销毁之前会先调用onSaveInstanceState()方法去保存你应用中的一些数据,然后调用onDestroy()方法,最后调用onCreate()、onStart()、onResume()等方法启动一个新的Activity。
如果想让某些配置在发生改变的时候不重启Activity,需要为Activity添加android:configChanges属性,该属性可以设置多个值,用"|"隔开,例如:“locale|navigation|orientation。设置了android:configChanges属性后,当指定的属性发生变化时,不会去重新启动Activity,而是通知程序去调用Activity的onConfigurationChanged()方法。例如:在进行横竖屏的切换时,会重新启动Activity,而定义了android:configChanges=“orientation|keyboardHidden”,就不会重新启动Activity了,而是去调用 onConfigurationChanged()方法。
简言之,在Activity中添加了android:configChanges属性,目的是当android:configChanges所设置的属性值对应的配置属性发生改变时,通知程序调用 onConfigurationChanged()函数,而不会重启Activity。
二、android:configChanges属性可以指定的值
“mcc” :国际移动用户识别码所属国家代号改变了----- sim被侦测到了,去更新mcc,mcc是移动用户所属国家代号
“mnc”: 国际移动用户识别码的移动网号码改变了------ sim被侦测到了,去更新mnc,MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网
“locale”: 地址改变了-----用户选择了一个新的语言会显示出来
“touchscreen”: 触摸屏是改变了------通常是不会发生的
“keyboard” :键盘发生了改变----例如用户用了外部的键盘
“keyboardHidden”: 键盘的可用性发生了改变
“navigation”: 导航发生了变化-----通常也不会发生
“screenLayout”: 屏幕的显示发生了变化------不同的显示被激活
“fontScale”: 字体比例发生了变化----选择了不同的全局字体
“uiMode”: 用户的模式发生了变化
“orientation”: 屏幕方向改变了
“screenSize”: 屏幕大小改变了
“smallestScreenSize”: 屏幕的物理大小改变了,如:连接到一个外部的屏幕上
三丶案例
在Activity运行过程中拔插usb设备是会发生重启Activity的现象,原因:usb设备被识别成实体键盘,导致Configuration改变,最终系统重启了activity
解决问题
如图所示,在androidmanifest.xml文件定义指定activity的地方新增 android:configChanges=“keyboard|keyboardHidden”
字段
在activity的java文件内重写onConfigurationChanged方法
最终效果如下,在usb设备被识别成实体键盘,导致Configuration改变时,将会直接走onConfigurationChanged方法内的内容,而不是直接重启activity
总结
通过在androidmanifest.xml文件定义指定activity的地方新增 android:configChanges="keyboard|keyboardHidden"和在activity的java文件内重写onConfigurationChanged方法,最终解决问题
每日赠言
且听,且忘,且随风,且行,且看,且从容
参考链接
https://blog.csdn.net/weixin_42600398/article/details/122525304