横竖屏切换及启动SessionActivity时出现Android Activity循环问题
你遇到的是**强制横屏的Activity在启动或横竖屏切换时,出现生命周期重复执行(如onDestroy反复触发)**的典型问题,本质是系统配置变化(方向切换)和Activity固定屏幕方向的设置冲突导致的循环触发,下面给你几个实用的解决方案:
问题根源
当你给SessionActivity设置android:screenOrientation="landscape"后,系统在处理方向变化时会尝试将Activity切换到横屏,但如果此时系统的配置变化触发了Activity的重启机制,重启后的Activity又会再次触发固定横屏的设置,进而形成循环,导致生命周期方法反复执行。
解决方案1:添加configChanges属性避免Activity重启
最直接的解决方式是在Manifest的SessionActivity配置中添加android:configChanges属性,告诉系统当方向、屏幕尺寸变化时不要重启Activity,而是回调onConfigurationChanged方法:
<activity android:name=".activities.SessionActivity" android:screenOrientation="landscape" android:configChanges="orientation|screenSize|smallestScreenSize"> </activity>
如果需要在方向变化时做自定义处理,可以在SessionActivity(或BaseActivity)中重写onConfigurationChanged方法:
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 这里可以添加方向变化后的自定义逻辑,比如更新布局或状态 }
解决方案2:限制初始化逻辑仅在首次创建时执行
如果你的业务需要保留Activity的重启机制(比如依赖savedInstanceState恢复状态),可以在onCreate中检查savedInstanceState是否存在,避免重复执行可能引发循环的逻辑:
public class SessionActivity extends BaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 仅在Activity首次创建时执行初始化逻辑,避免重启后重复触发 if (savedInstanceState == null) { // 你的初始化代码,比如绑定视图、请求数据等 } } }
同时记得检查BaseActivity中是否有动态设置屏幕方向的代码,如果有,要确保这些逻辑不会和Manifest中的固定方向设置冲突,比如不要在生命周期中反复切换方向。
内容的提问来源于stack exchange,提问作者Vaibhav Bhandula

