Активность перезапускается при принудительном закрытии

У меня есть приложение с одной корневой активностью. Недавно я обратил внимание на то, что любое принудительное закрытие моей активности приводит к ее перезапуску, и я понятия не имею, почему это может произойти. Если я вызову неперехваченное исключение или использую опцию «долгое нажатие, чтобы принудительно закрыть», оба результата приведут к одному и тому же результату.

Мое единственное предположение было бы какой-то причудой, связанной с сохраненными ссылками на какую-то часть действия, только у меня нет никаких за пределами некоторых записей WeakReference на уровне приложения.

Соответствующие записи logcat:

05-25 08:25:49.137: INFO/ActivityManager(18449): Displayed uk.co.randomicon.rstb/.TreeBuilderActivity: +8s82ms
05-25 08:25:54.222: DEBUG/dalvikvm(18546): GC_EXPLICIT freed 12K, 57% free 3640K/8327K, external 8323K/10136K, paused 72ms
05-25 08:25:55.373: WARN/InputManagerService(18449): Got RemoteException sending setActive(false) notification to pid 19122 uid 10069
05-25 08:25:59.217: DEBUG/dalvikvm(18646): GC_EXPLICIT freed 128K, 48% free 2980K/5703K, external 0K/0K, paused 67ms
05-25 08:26:00.238: DEBUG/dalvikvm(18991): GC_CONCURRENT freed 343K, 51% free 2794K/5639K, external 303K/532K, paused 3ms+3ms
05-25 08:26:02.950: INFO/Process(18449): Sending signal. PID: 19554 SIG: 9
05-25 08:26:02.980: INFO/ActivityManager(18449): Process uk.co.randomicon.rstb (pid 19554) has died.
05-25 08:26:02.990: ERROR/InputDispatcher(18449): channel '40a16ec8 uk.co.randomicon.rstb/uk.co.randomicon.rstb.TreeBuilderActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
05-25 08:26:02.990: ERROR/InputDispatcher(18449): channel '40a16ec8 uk.co.randomicon.rstb/uk.co.randomicon.rstb.TreeBuilderActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
05-25 08:26:02.990: INFO/WindowManager(18449): WINDOW DIED Window{40a16ec8 uk.co.randomicon.rstb/uk.co.randomicon.rstb.TreeBuilderActivity paused=false}
05-25 08:26:03.010: WARN/WindowManager(18449): Failed looking up window
05-25 08:26:03.010: WARN/WindowManager(18449): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@40c774e0 does not exist
05-25 08:26:03.010: WARN/WindowManager(18449):     at com.android.server.WindowManagerService.windowForClientLocked(WindowManagerService.java:8177)
05-25 08:26:03.010: WARN/WindowManager(18449):     at com.android.server.WindowManagerService.windowForClientLocked(WindowManagerService.java:8168)
05-25 08:26:03.010: WARN/WindowManager(18449):     at com.android.server.WindowManagerService$WindowState$DeathRecipient.binderDied(WindowManagerService.java:7026)
05-25 08:26:03.010: WARN/WindowManager(18449):     at android.os.BinderProxy.sendDeathNotice(Binder.java:385)
05-25 08:26:03.010: WARN/WindowManager(18449):     at dalvik.system.NativeStart.run(Native Method)
05-25 08:26:03.010: INFO/WindowManager(18449): WIN DEATH: null
05-25 08:26:03.020: INFO/ActivityManager(18449): Start proc uk.co.randomicon.rstb for activity uk.co.randomicon.rstb/.TreeBuilderActivity: pid=19565 uid=10069 gids={1015}

Любые идеи, где хотя бы начать тыкать, будут с благодарностью приняты!

EDIT: это было вызвано тем, что я установил android:stateNotNeeded="true" в своем манифесте. Хотя мне не нужно состояние, это заставило Android решить, что лучше перезапустить мое приложение, исходя из предположения, что пользователь этого захочет.


person Zulaxia    schedule 25.05.2011    source источник


Ответы (3)


здесь полезная информация:

Что касается перезапуска действия — если процесс, выполняющий действие переднего плана, прекращается, система отбрасывает это действие, если для него нет действительного сохраненного состояния (обычно это означает, что оно приостановлено и дало системе результат onSaveInstanceState до паузы). Как только он решит, следует ли отбрасывать это действие, он возобновит любое действие, которое сейчас находится на вершине стека. Если это одно из ваших действий — либо потому, что у вас есть другое позади того, которое потерпело крах, или то, которое потерпело крах, было каким-то образом в установленном состоянии паузы — тогда он снова запустит ваш процесс, чтобы показать это главное действие< /сильный>.

person inazaruk    schedule 25.05.2011
comment
Спасибо, хорошая информация. Просто надеюсь, что я смогу его использовать :) Я отметил как полезный на данный момент и приму, если он окажется в установленной паузе. - person Zulaxia; 25.05.2011
comment
Информация оказалась идеальной, но не в той части, о которой я думал. Я понял, что упоминалось о его выбрасывании, если у него не было действительного сохраненного состояния, только у меня было android:stateNotNeeded=true в моем манифесте. Поэтому он всегда думал, что перезапустить его можно (поскольку технически это было так). Принял ваш ответ, спасибо! - person Zulaxia; 25.05.2011
comment
Аналогично, правильная идея, но нужно другое решение. При запуске нового действия я использовал флаги: Intent.FLAG_ACTIVITY_NEW_TASK | Намерение.FLAG_ACTIVITY_CLEAR_TASK | Намерение.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS. Это запускает задачу в новом потоке и гарантирует, что все предыдущие вхождения вашего приложения исчезнут из стека. - person Peri Hartman; 17.03.2015

Это может быть вызвано вызовом системного API, который недоступен на вашем целевом устройстве. Я столкнулся с аналогичной проблемой, пытаясь вызвать ActivityManager.MemoryInfo.totalMem на устройстве 4.0.x. У меня не было ошибок компиляции, так как я ориентировался на 4.2.2, а ActivityManager.MemoryInfo.totalMem был добавлен в API16 (4.1)

person TheDerputy    schedule 10.05.2013

если приложение имеет android:persistent="true" в манифесте, оно перезапустится после уничтожения.

person Larry Liang    schedule 23.09.2016