我试图仅在棒棒糖上使用新的API进行 Activity 转换(我使用的是紧凑版tho),所以我要在 Activity A中实现从 Activity A到 Activity B的动画:

getWindow().setReenterTransition(null);
getWindow().setExitTransition(null);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);

因为我对进入或退出此 Activity 不感兴趣,所以我唯一想看到的动画是在与 Activity B的共享 View 中。

要启动 Activity B:
ActivityCompat.startActivity(this, intent, ActivityOptionsCompat.makeSceneTransitionAnimation(this, fabButton, getString(R.string.transition_fab)).toBundle());

以及 Activity B的设置:
getWindow().setEnterTransition(new EmptyTransition());
getWindow().setReturnTransition(null);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
getWindow().getEnterTransition().addListener(listener).

再次,我对返回转换的输入转换不感兴趣,因为在调用输入转换监听器方法“onTransitionEnd”之前,内容一直处于隐藏状态,所以我的转换全部基于从 Activity A到 Activity B移动/增长的共享元素。过渡完成后,我将内容带入。

一切正常,但在功能不十分强大的设备(因此所有非Nexus设备)上时常出现, Activity A默默崩溃,并出现以下情况:
java.lang.RuntimeException: Performing stop of activity that is not resumed: {com.transferwise.android.debug/com.transferwise.android.activity.LoggedInMainActivity}

并且发生了共享元素的转换,但是随后未调用侦听器(不是事件TransitionStart),因此不会输入内容。该应用程序没有崩溃,用户仍然可以按回去并“重试”,但这不是一个很好的用户体验。

测试它很困难,因为它每10/20次发生一次,并且仅在某些特定设备上发生(在Sony Xperia Z3紧凑型计算机上发生的次数更多)。

也:
Danieles-MacBook-Pro-2:~ danielebottillo$ adb shell dumpsys activity p | grep com.package.main.debug
  *APP* UID 10349 ProcessRecord{3b27508d 18371:com.package.main.debug/u0a349}
    dir=/data/app/com.package.main.debug-1/base.apk publicDir=/data/app/com.package.main.debug-1/base.apk data=/data/data/com.package.main.debug
    packageList={com.package.main.debug}
      - ActivityRecord{2f07bdf8 u0 com.package.main.debug/com.package.main.activity.ActivityA t1196}
      - ActivityRecord{1e871eb3 u0 com.package.main.debug/com.package.main.activity.ActivityB t1196}
      - 28ea3e28/com.android.providers.settings/.SettingsProvider->18371:com.package.main.debug/u0a349 s1/1 u0/0 +27m9s645ms
      - ReceiverList{40f2178 18371 com.package.main.debug/10349/u0 remote:39e102db}
      - ReceiverList{2e7456a6 18371 com.package.main.debug/10349/u0 remote:dde3801}
      - ReceiverList{39e2f1b7 18371 com.package.main.debug/10349/u0 remote:362300b6}
      - ReceiverList{3afa7bd5 18371 com.package.main.debug/10349/u0 remote:33e4088c}
    Proc # 0: fore  F/A/T  trm:10 18371:com.package.main.debug/u0a349 (top-activity)
    PID #18371: ProcessRecord{3b27508d 18371:com.package.main.debug/u0a349}

最佳答案

从这里的其他答案来看,我可以看到几种可能性。

Memory:设备的内存可能不足,因此Android会杀死非前台 Activity 。在 Activity A被杀死之后,它可能正在尝试使用fabButton进行操作。您可以减少内存消耗,看看是否可以减少或消除该问题?

Lifecycle:如果您要从Activity A的onStart()方法中的Activity A过渡到Activity B,那么Activity A可能在运行onResume()之前就被杀死了。如果onStart()中有任何重要代码,请尝试将其移至onResume()。那应该防止 Activity A在到达onResume()之前被杀死。

07-24 09:49
查看更多