已配置android:configChanges="orientation|screenSize",为何PdfViewActivity旋转设备时仍重启而MainActivity正常?
这个问题我之前帮朋友排查过,大概率是几个容易忽略的细节出了问题,咱们一步步来捋:
先确认清单配置是否真的生效
别着急看代码,先打开Android Studio的「Merged Manifest」(在清单文件编辑器底部),检查PdfViewActivity最终生效的android:configChanges属性:- 有没有拼写错误?比如
screenSize是驼峰写法,别写成全小写的screensize;竖线分隔符有没有漏写? - 配置是不是直接写在
<activity>标签内?有没有不小心嵌套到<intent-filter>或者其他子标签里? - 多模块项目里,子模块的清单配置会不会被主模块覆盖?
正确的配置应该是这样:
<activity android:name=".PdfViewActivity" android:configChanges="orientation|screenSize" />- 有没有拼写错误?比如
第三方PDF库可能在搞事情
很多主流的PDF查看库(比如AndroidPdfViewer)内部可能有自己的配置处理逻辑,有些旧版本甚至会强制重启Activity来适配屏幕变化。你可以:- 检查库的官方文档,看看有没有禁用自动重启的配置项;
- 尝试更新到库的最新版本,说不定已经修复了这个问题;
- 如果是用Fragment承载PDFView,确认有没有给Fragment设置
setRetainInstance(true),避免Fragment重建触发Activity重启。
固定屏幕方向的冲突
如果PdfViewActivity的清单里同时设置了android:screenOrientation="portrait"或者landscape,旋转设备时系统其实不会触发orientation类型的配置变化(因为方向被锁死了),但如果代码里有动态切换方向的逻辑,或者库强制修改了方向,就可能和configChanges的配置冲突,导致Activity重启。可以先暂时去掉screenOrientation属性测试一下。重写
onConfigurationChanged时漏了关键调用
虽然不重写这个方法也不会导致重启,但如果PdfViewActivity里重写了onConfigurationChanged,却没有调用super.onConfigurationChanged(newConfig),会打乱系统的配置处理逻辑,间接引发重启。检查代码里有没有这个问题:@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 这行必须要有! // 你的自定义适配逻辑 }有没有动态修改配置的代码?
看看PdfViewActivity里有没有调用过setRequestedOrientation()、getResources().updateConfiguration()这类改变配置的方法?这些操作会绕过configChanges的设置,强制触发Activity重启。比如加载PDF后动态锁定方向的逻辑,就可能踩这个坑。
建议先从「Merged Manifest」检查开始,这是最容易排查的点,再一步步排除其他可能性。
内容的提问来源于stack exchange,提问作者Thetpaing Win

