2011-05-25 147 views
11

我有一个具有单个根活动的应用程序。我最近让我注意到,任何种类的强制关闭我的活动导致重新启动,我不知道为什么会发生这种情况。如果我强制未捕获的异常或使用“长时间按压强制关闭”选项,它们都会导致相同。活动重新启动强制关闭

我唯一的猜测是某种形式的怪癖,涉及到活动某些部分的保留引用,只有我没有在应用程序级别的某些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 [email protected] 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} 

任何想法在哪里甚至开始乱抓会受到欢迎!

编辑:这是我在我的Manifest中设置android:stateNotNeeded =“true”引起的。虽然我不需要这个状态,但这导致Android决定最好在假设用户愿意的情况下重新启动我的应用程序。

回答

15

Here是一些有用的信息:

至于当活动被重新启动 - 如果运行 前台活动的过程中消失时,系统会产生 它不扔掉活动有一个有效的保存状态(通常意味着它暂停了 ,并且已经从 暂停之前向系统提供了onSaveInstanceState的结果)。一旦决定是否放弃该活动, 将恢复现在堆叠顶部的任何活动。如果这是 你的活动之一 - 或者因为你有另一个 坠毁,或坠毁的那个是某种方式,它已经结束了暂停状态 - 然后它将再次启动你的过程以显示最高活动

+0

谢谢,很好的信息。只是希望我可以使用它:)我已经标记为现在有用,并会接受,如果它原来处于稳定的暂停。 – Zulaxia 2011-05-25 08:51:48

+0

原来是完美的信息,但不是我认为的那部分。如果它没有一个有效的保存状态,我意识到它提到了它,只有我的清单中有android:stateNotNeeded =“true”。所以它一直认为可以重新启动它(因为技术上是这样)。接受你的答案,谢谢! – Zulaxia 2011-05-25 08:56:43

+0

同样,正确的想法,但需要一个不同的解决方案。当开始新的活动时,我使用了标志:Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | \t \t Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS。这会在新线程上启动任务,并确保您的应用的所有先前事件都从后台消失。 – 2015-03-17 17:42:21

1

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

0

如果应用程序在清单中具有android:persistent =“true”,它会在杀死时重新启动。