5

我的应用程序在与其他应用程序玩了一段时间后回到前台时崩溃,我不知道如何修复它。

我的应用程序有一个启动屏幕活动,它从 Web 服务加载一些数据并将其放入在扩展 Application 的类中声明的全局静态变量中,如此 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

并且调试器已分离。

现在,当我再次打开我的应用程序时,如果最新的活动不使用全局变量,则会启动它(在这种情况下,一旦我导航到使用全局变量的活动,它就会崩溃),或者如果它使用则立即崩溃。

如果我的应用程序被杀死,这似乎是因为即使我的位置服务也停止了,如 logcat 中所见,为什么它会打开最新的活动而不是从启动屏幕再次启动?

4

3 回答 3

5

这不是您问题的直接答案,但我认为它可能有用。

您将数据存储在全局变量中的决定是错误的。那是因为每次用户离开它时,您的应用程序都可能被杀死。当他或她回来时,您需要重新加载数据。

您应该使用ContentProviderServiceService应从 Internet 加载数据并将其存储到ContentProvider. ContentProvider应该持久化数据。所有活动都ContentProvider应用于访问此缓存数据。

这样您的应用程序:

  1. 无需每次启动应用程序时下载数据(节省 CPU、电池和带宽)
  2. 您的活动可以依赖于 ContentProvider 中有缓存数据这一事实。
  3. 每次在 ContentProvider 中更新数据时,都会通知每个 Activity 并更新 UI。
  4. 数据在ContentProvider应用程序运行中保持不变(例如,如果您使用 SQLite)。
  5. 从 Web 服务读取数据并将其与 ContentProvider 同步的后台服务与活动完全分离。

当然,您需要投入一些时间来实施ServiceContentProvider正确处理Acitivities. 但是您的应用程序将更加健壮和可扩展(您可以轻松添加新组件)。

于 2011-08-02T11:15:44.037 回答
2

解决您的问题的一个肮脏的解决方法是检查全局变量是否填充到活动的onResume 方法中。如果未填充变量,则使用设置了CLEAR_TOP标志的 Intent 启动启动画面活动。这应该会导致您的所有活动从活动堆栈中删除,并且您的初始屏幕将加载并且能够重新加载您的应用程序工作所需的所有数据。

这是一个肮脏的解决方法,可以帮助设计不良的应用程序正常工作。如果您希望您的应用程序对您和用户更好,请使用 inazaruk 提供的解决方案。他对应用程序的基本设置是正确的。

于 2011-08-02T11:24:33.147 回答
1

当 android 杀死你的应用程序时,它这样做只是为了节省资源。为了获得更好的可用性,操作系统将记住您在该应用程序中的位置(如果您实现了正确的侦听器,则将活动堆栈之类的内容保存为实例状态)。

当您恢复您的应用程序时,它将恢复活动和其他所有内容。当您将数据保存到全局静态变量时,这些可能在应用程序终止时“丢失”了!

我建议您使用数据库或至少在使用之前检查数据是否仍然存在(例如MyClassHolder.myGlobalStaticParameter == null:)

于 2011-08-02T11:26:40.640 回答