如果我关闭蓝牙键盘或者离开安卓平板远了,这将导致活动销毁并重新创建。因此,如何避免这个问题呢?
如果我关闭蓝牙键盘或者离开安卓平板远了,这将导致活动销毁并重新创建。因此,如何避免这个问题呢?
keyboard|keyboardHidden
是不够的。我正在使用罗技蓝牙键盘(型号 #JNZYR0021)。这个才起作用:<activity
...
android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation"
/>
显然,这款罗技键盘也会改变导航
,这很奇怪,因为Android文档中说:
导航类型(轨迹球/ dpad)已更改。(这通常不应该发生。)
真是匪夷所思。
将蓝牙键盘配对视为配置更改:
尝试在AndroidManifest.xml中添加以下内容:
android:configChanges="keyboard|keyboardHidden"
来源: http://developer.android.com/guide/topics/manifest/activity-element.html#config android:configChanges
对我来说,在configChanges中添加"orientation|screenSize|keyboard|keyboardHidden|navigation"仍然会调用活动的onDestroy和onCreate。经过长时间的研究,我找到了这篇文章: https://developer.samsung.com/sdp/blog/en-us/2017/12/07/samsung-dex-lifecycle-on-switching-between-mobile-and-samsung-dex-mode
基本上,如果您使用联想的生产力模式或三星DeX,它仍然会重新创建应用程序,因此如果您希望应用程序在添加物理/蓝牙键盘时不重新创建自己,则需要添加所有这些内容:
<activity android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|uiMode|density">
此外,在AndroidManifest中添加以下内容以支持Samsung DeX:
<meta-data
android:name="com.samsung.android.keepalive.density"
android:value="true" />
keyboard|keyboardHidden|navigation
是不够的,Activity仍然会被重新创建。我尝试找到一种通用的方法来找到配置更改的原因。OnConfigurationChange()
方法,使用Configuration.diff()
计算newConfig
和当前配置(可以从getResources().getConfiguration()
获取)之间的差异。结果是一个十进制数,将其转换为十六进制数,并计算由以CONFIG_
开头的常量名称组合而成的值在ActivityInfo
中的含义。CONFIG_KEYBOARD = 0x0010;
,CONFIG_KEYBOARD_HIDDEN = 0x0020
,CONFIG_NAVIGATION = 0x0040
,这意味着在此配置更改期间更改了这三个标志。