问题 强制关闭时活动重新启动


我有一个具有单个根Activity的应用程序。我最近引起了我的注意,任何一种强制关闭我的活动导致它重新启动,我不知道为什么会这样。如果我强制执行未捕获的异常或使用“长按后强制关闭”选项,它们都会产生相同的结果。

我唯一的猜测是某些形式的怪癖与保留对Activity的某些部分的引用相关,只是我在应用程序级别没有任何一些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}

任何想要开始戳的想法都会感激不尽!

编辑:这是由我设置引起的 机器人:stateNotNeeded = “真” 在我的清单中。虽然我不需要状态,但这导致Android决定最好在用户希望的情况下重新启动我的应用程序。


12957
2018-05-25 08:00


起源



答案:


这里 是一些有用的信息:

至于重新启动活动时 - 如果进程正在运行   如果前景活动消失,系统将丢弃该活动   它没有有效的保存状态(通常意味着它已暂停   并且给了系统之前的onSaveInstanceState的结果   暂停)。一旦决定是否抛弃该活动,它就会   将恢复现在位于堆栈顶部的任何活动。如果是这样的话   你的一项活动 - 或者是因为你有另一项活动   那个坠毁,或者 坠毁的那个人在某种程度上是稳定的暂停状态    - 然后它将再次启动您的流程以显示最高活动


15
2018-05-25 08:07



谢谢,好消息。只是希望我可以使用它:)我已经标记为现在有用,并且如果结果是在已经确定的暂停中将接受。 - Zulaxia
原来是完美的信息,但不是我认为的部分。我意识到它提到如果它没有有效的保存状态就扔掉它,只有我的清单中有android:stateNotNeeded =“true”。所以它一直认为重新启动它是好的(因为它本来就是)。接受你的回答,谢谢! - Zulaxia
同样,正确的想法但需要一个不同的解决方案在开始新活动时,我使用了标志:Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS。这将在新线程上启动任务,并确保您的应用程序之前的所有事件都从后台堆栈中消失。 - Peri Hartman


答案:


这里 是一些有用的信息:

至于重新启动活动时 - 如果进程正在运行   如果前景活动消失,系统将丢弃该活动   它没有有效的保存状态(通常意味着它已暂停   并且给了系统之前的onSaveInstanceState的结果   暂停)。一旦决定是否抛弃该活动,它就会   将恢复现在位于堆栈顶部的任何活动。如果是这样的话   你的一项活动 - 或者是因为你有另一项活动   那个坠毁,或者 坠毁的那个人在某种程度上是稳定的暂停状态    - 然后它将再次启动您的流程以显示最高活动


15
2018-05-25 08:07



谢谢,好消息。只是希望我可以使用它:)我已经标记为现在有用,并且如果结果是在已经确定的暂停中将接受。 - Zulaxia
原来是完美的信息,但不是我认为的部分。我意识到它提到如果它没有有效的保存状态就扔掉它,只有我的清单中有android:stateNotNeeded =“true”。所以它一直认为重新启动它是好的(因为它本来就是)。接受你的回答,谢谢! - Zulaxia
同样,正确的想法但需要一个不同的解决方案在开始新活动时,我使用了标志:Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS。这将在新线程上启动任务,并确保您的应用程序之前的所有事件都从后台堆栈中消失。 - Peri Hartman


这可能是由于调用目标设备上不可用的系统API引起的。我遇到了类似的问题,然后尝试在4.0.x设备上调用ActivityManager.MemoryInfo.totalMem。我没有得到任何编译错误,因为我的目标是4.2.2并且API16(4.1)中添加了ActivityManager.MemoryInfo.totalMem


1
2018-05-10 16:57





如果app在清单中有android:persistent =“true”,它会在被杀时重启。


0
2017-09-23 04:26