我的应用程序在使用其他应用程序播放一段时间后返回前台时崩溃了,我无法找到解决方法。
我的应用程序有一个启动画面活动,它从Web服务加载一些数据并将其放在扩展Application的类中声明的全局静态变量中,如this SO question中所述。加载所有数据后,此活动将启动Home活动,其中包含一些菜单以在应用程序中导航。全球变量用于大多数活动。
在某些时候,在玩其他应用时,似乎我的应用程序被杀了,因为我可以在logcat中看到这个:
I/ActivityManager( 2465): Process com.mysite.myapp (pid 23538) has died.
I/WindowManager( 2465): WIN DEATH: Window{4852a678 com.mysite.myapp/com.mysite.myapp.Home paused=false}
I/WindowManager( 2465): WIN DEATH: Window{485b63a8 com.mysite.myapp/com.mysite.myapp.Home paused=false}
I/WindowManager( 2465): WIN DEATH: Window{4826fbf8 com.mysite.myapp/com.mysite.myapp.ItemList paused=false}
I/WindowManager( 2465): WIN DEATH: Window{48286f90 com.mysite.myapp/com.mysite.myapp.ItemDetail paused=false}
W/GpsLocationProvider( 2465): Unneeded remove listener for uid 1000
D/GpsLocationProvider( 2465): stopNavigating
D/gps_BRCM( 2465): [status check] on_stop() : GPS_STATUS_SESSION_END
D/gps_BRCM( 2465): gps_engine_status_update 2
D/GpsLocationProvider( 2465): send an intent to notify that the GPS has been enabled or disabled
D/gps_BRCM( 2465): gps_stop: called
V/GpsLocationProvider( 2465): hybridGpsSensorDeregister : No registered sensorManager
D/GpsLocationProvider( 2465): hybridGpsSensorDeregister
并且分离了调试器。
现在,当我再次打开我的应用程序时,如果它不使用全局变量,则会启动最新的活动(在这种情况下,一旦我导航到活动就会崩溃),或者如果它立即崩溃,则立即崩溃。 / p>
如果我的应用程序被杀,这似乎就是这种情况,因为即使我的位置服务已停止,如logcat中所示,为什么它会打开最新的活动而不是从启动画面再次启动?
答案 0 :(得分:5)
这不是你问题的直接答案,但我认为它可能有用。
您决定将数据存储在全局变量中是不好的。这是因为每次用户离开它时你的应用都会被杀死。当他或她回来时,你需要重新加载数据。
您应该使用ContentProvider
和Service
。 Service
应从互联网上加载数据并将其存储到ContentProvider
。 ContentProvider
应保留数据。所有活动都应使用ContentProvider
来访问此缓存数据。
这样你的申请:
ContentProvider
中的数据在应用程序运行期间保持不变(例如,如果您使用SQLite)。原因是您需要花一些时间来实施Service
和ContentProvider
,以及Acitivities
中的正确处理。但是您的应用程序将更加强大和可扩展(您可以轻松添加新组件)。
答案 1 :(得分:2)
问题的一个肮脏的解决方法是检查全局变量是否填充在您的活动的onResume method中。如果未填充变量,请使用设置了CLEAR_TOP标志的Intent启动splashscreen活动。这应该会导致您从活动堆栈中删除所有活动,并且您的启动屏幕将加载并能够重新加载应用程序运行所需的所有数据。
这是一个肮脏的解决方法,可帮助设计糟糕的应用程序。 如果您希望您的应用程序对您更好,并且用户使用提供的解决方案inazaruk。他对应用程序的基本设置是正确的。
答案 2 :(得分:1)
当android杀死你的应用程序时,它只是为了节省资源。为了获得更好的可用性,操作系统将记住您在该应用程序中的位置(如果您实现了正确的侦听器,则保存活动堆栈等实例状态)。
当您恢复应用时,它将恢复活动和其他所有内容。当您将数据保存到全局静态变量时,这些可能在应用程序终止时“丢失”了!
我建议您在使用数据库之前使用数据库或至少检查数据是否仍然存在(例如:MyClassHolder.myGlobalStaticParameter == null
)