Переход активности: выполнение остановки активности, которая не возобновляется

Я пытаюсь использовать новый API для перехода активности только на леденец (хотя я использую компактную версию), поэтому я реализую анимацию от действия A к действию B в действии A:

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

поскольку меня не интересует вход или выход из этого действия, единственные анимации, которые я хочу видеть, находятся в общем представлении с действием B.

Для запуска 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, поэтому мой переход основан на общем элементе, который перемещается/растет от действия A к действию 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), поэтому контент не поступает. Приложение не вылетает, пользователь все еще может нажать «назад» и «попробовать еще раз», но это не очень хороший UX.

Проверить это сложно, потому что это происходит раз в 10-20 раз и только на некоторых конкретных устройствах (чаще на Sony Xperia Z3 compact).

Также:

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}

person Daniele Bottillo    schedule 27.04.2015    source источник
comment
Привет. У меня такая же проблема. Вы когда-нибудь выясняли, что было причиной этого?   -  person black    schedule 11.03.2016
comment
просто проблема с памятью к сожалению   -  person Daniele Bottillo    schedule 13.03.2016


Ответы (1)


Судя по другим ответам здесь, я вижу несколько возможностей.

Память: возможно, устройство работает на низком уровне в памяти, поэтому Android убивает неактивные действия. Возможно, он пытается что-то сделать с fabButton после уничтожения Activity A. Можете ли вы уменьшить потребление памяти и посмотреть, уменьшит ли это проблему или устранит ее?

Жизненный цикл: если вы переходите от действия A к действию B из метода onStart() действия A, то действие A может быть уничтожено до того, как оно когда-либо запустит onResume(). Если у вас есть значительный код в onStart(), попробуйте переместить его в onResume(). Это должно предотвратить уничтожение Activity A до того, как оно доберется до onResume().

person Dalbergia    schedule 04.09.2015