如何避免setRequestedOrientation设置Activity方向时出现延迟
问题原因
你遇到的闪烁问题是setRequestedOrientation调用时机过晚导致的:系统启动Activity时会优先读取Manifest中配置的默认方向(默认值为unspecified,跟随设备物理方向),先加载对应方向的布局和预览窗口,等执行到你onCreate里的方向设置代码时才会触发旋转,所以会出现先竖屏再切横屏的闪烁。
解决方案
根据你的使用场景可以选择以下两种方案:
方案1:目标Activity方向和前一个Activity一致(适配你的示例场景)
直接在Manifest中给Activity2配置android:screenOrientation="behind"属性即可:
<activity android:name=".Activity2" android:screenOrientation="behind" />
这个属性会让新启动的Activity直接继承返回栈中前一个Activity的方向,不需要在代码中额外调用方向设置接口,完全不会出现方向闪烁。
方案2:目标Activity方向需要动态自定义
如果方向需要根据用户输入动态调整,不固定和前一个Activity一致,按以下步骤修改:
- 启动Activity2时,把目标方向作为参数传入Intent:
// MainActivity里跳转的逻辑 Intent intent = new Intent(this, Activity2.class); // 传入你需要动态设置的方向常量,这里以横屏为例 intent.putExtra("TARGET_ORIENTATION", ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); startActivity(intent);
- 重写Activity2的
attachBaseContext方法,在这个更早的生命周期节点设置方向:
public class Activity2 extends AppCompatActivity { @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); // 提前拿到Intent里的方向参数,赶在系统加载布局之前设置方向 int targetOrientation = getIntent().getIntExtra("TARGET_ORIENTATION", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); if (targetOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { setRequestedOrientation(targetOrientation); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 不需要在onCreate里再设置方向了 } }
- (可选)如果低版本系统仍然有预览窗口闪烁的问题,可以给Activity2配置禁用预览的启动主题:
首先在res/values/styles.xml中添加无预览主题:
<style name="NoPreviewLaunchTheme" parent="你的App主主题父类"> <item name="android:windowDisablePreview">true</item> <item name="android:windowBackground">@color/你App的主背景色</item> </style>
然后在Manifest中给Activity2绑定这个主题:
<activity android:name=".Activity2" android:theme="@style/NoPreviewLaunchTheme" />
这个配置会跳过系统默认的启动预览窗口,等Activity的方向和布局加载完成后再显示页面,彻底避免闪烁。
内容的提问来源于stack exchange,提问作者Addev
相关产品推荐
相关产品推荐

