延迟启动+熄屏场景下Activity共享元素转场背景异常求助
Activity共享元素转场:延迟跳转+锁屏后出现无背景/画面错乱Bug
问题复现步骤
- 基于ActivitySceneTransitionBasic示例项目
- 在Activity跳转前添加2秒延迟,代码如下:
new Handler().postDelayed(() -> { ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle()); }, 2000); - 跳转延迟期间关闭屏幕
未锁屏直接跳转无异常,锁屏后触发跳转时,新Activity启动会出现无背景(见下图)或画面错乱的情况:
解决方案
1. 延迟任务内重新创建ActivityOptions
锁屏后原Activity的视图可能被系统回收或状态重置,复用提前创建的activityOptions会导致转场所需的视图元数据失效。修改代码,在延迟回调内部重新获取共享元素并生成转场配置:
new Handler().postDelayed(() -> { // 重新获取共享视图与转场配置 View sharedElement = findViewById(R.id.your_shared_view_id); ActivityOptions updatedOptions = ActivityOptions.makeSceneTransitionAnimation( MainActivity.this, sharedElement, "your_transition_name" ); ActivityCompat.startActivity(MainActivity.this, intent, updatedOptions.toBundle()); }, 2000);
2. 基于屏幕状态调整转场逻辑
通过监听屏幕点亮事件,确保转场仅在屏幕活跃状态下执行:
// 注册屏幕点亮广播接收器 private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) { // 屏幕点亮后执行转场 performSharedTransition(); unregisterReceiver(this); } } }; private void performSharedTransition() { View sharedElement = findViewById(R.id.your_shared_view_id); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation( MainActivity.this, sharedElement, "your_transition_name" ); ActivityCompat.startActivity(MainActivity.this, intent, options.toBundle()); } // 初始化延迟任务与广播监听 IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(screenOnReceiver, filter); new Handler().postDelayed(() -> { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (pm.isInteractive()) { // 当前屏幕活跃,直接转场 performSharedTransition(); } // 屏幕未点亮则等待广播触发 }, 2000);
注意:需在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
3. 锁屏时降级为普通跳转(临时方案)
如果上述方案无法适配,可在锁屏状态下跳过共享元素转场,使用普通跳转逻辑:
new Handler().postDelayed(() -> { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (pm.isInteractive()) { ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle()); } else { // 锁屏状态下使用普通跳转 ActivityCompat.startActivity(MainActivity.this, intent, null); } }, 2000);
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

