插入无线USB鼠标时Android应用重启 如何阻止Activity重启周期
问题根因
Android系统默认会在检测到系统配置发生变更时,销毁并重建前台Activity,用于加载适配新配置的对应资源。插入无线USB鼠标、键盘时,会被系统判定为输入类配置发生变更,因此触发Activity重启流程。
有线USB鼠标插入时不会触发系统配置变更判定,因此不会触发Activity重启。
触发重启的核心配置变更类型为三类:
- 键盘可用性/类型变更
- 导航设备(鼠标、触控板等)类型变更
- 部分设备上还会触发UI模式变更
解决方案
方案1:Manifest中声明自行处理配置变更(推荐)
直接在你的AndroidManifest.xml文件的MainActivity声明节点中,添加android:configChanges属性,声明你要自行处理对应类型的配置变更,不需要系统重启Activity:
<activity android:name=".MainActivity" android:exported="true" android:configChanges="keyboard|keyboardHidden|navigation|screenSize|smallestScreenSize|orientation"> <!-- 原有intent-filter等配置保持不变 --> </activity>
各属性作用说明:
keyboard|keyboardHidden:拦截键盘插拔带来的配置变更navigation:拦截鼠标、触控板等导航设备插拔带来的配置变更- 其余属性是常用的避免其他场景(如横竖屏切换、折叠屏尺寸变更)触发Activity重启的配置,可根据你的业务需求自行删减
方案2:重写配置变更回调(可选)
如果你的应用在输入设备变更后需要做特殊的适配调整,可以在MainActivity中重写onConfigurationChanged方法,自行处理变更后的逻辑:
// Java 示例 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 此处添加自定义适配逻辑,无特殊需求则只保留super调用即可 }
// Kotlin 示例 override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) // 此处添加自定义适配逻辑,无特殊需求则只保留super调用即可 }
注意事项
如果你的应用针对不同配置有不同的资源文件(比如不同键盘模式下的布局、横竖屏不同的UI),自行处理配置变更后,需要你手动在onConfigurationChanged中加载对应的适配资源,否则会继续使用变更前的资源。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

