You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

延迟启动+熄屏场景下Activity共享元素转场背景异常求助

Activity共享元素转场:延迟跳转+锁屏后出现无背景/画面错乱Bug

问题复现步骤

  • 基于ActivitySceneTransitionBasic示例项目
  • 在Activity跳转前添加2秒延迟,代码如下:
    new Handler().postDelayed(() -> {
          ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle());
    }, 2000);
    
  • 跳转延迟期间关闭屏幕

未锁屏直接跳转无异常,锁屏后触发跳转时,新Activity启动会出现无背景(见下图)或画面错乱的情况:
新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:28:20