我通过扩展Application在我的应用程序中定义了一些全局变量,如下所示。当我离开应用程序,打开更多应用程序并与它们玩一点,然后回到我的应用程序,全局变量已被删除,我的应用程序崩溃。我有两个问题:
1-这怎么可能?
2-如何在进入后台时强制我的应用退出?我知道我不应该这样做,但我找不到其他解决方案......
由于
public class GlobalVars extends Application {
public static HashMap<Integer, String> ID2Cat = new HashMap<Integer, String>();
// User logged bool
public static boolean isLogged = false;
// Current menu item
public static int currentMenuItem = 0;
public static boolean isHome = false;
// Goodideas
public static JSONObject goodIdeas = new JSONObject();
// Meteo
public static JSONArray weatherItems = new JSONArray();
// More stuff
}
的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
答案 0 :(得分:1)
1-这怎么可能?
您的流程可能随时终止。您不能假设任何静态数据成员或自定义Application
对象将存在多长时间。它们最多只能用作缓存。
2-如何在前往后台时强制我的应用退出?
你没有。
我知道我不应该这样做
不仅如此,在这种情况下它也无济于事。所有这一切都意味着你会100%崩溃,因为你实际上并没有真正适当地初始化。
但我找不到其他解决方案。
初始化您的数据。如果您的应用程序因为创建了新的自定义Application
实例而崩溃,则您的Application
子类会出现错误,您需要修复它们。
答案 1 :(得分:1)
您应该使用适当的生命周期事件处理程序来保存数据并在重新激活时恢复它:onSaveInstanceState(),onPause()和onResume()。您无法安全地假设您的全局字段将保持不变。
我建议用Activity life-cycle对自己进行家庭化。
答案 2 :(得分:1)
很简单,你必须在Application.OnCreate中初始化你声明的变量,我刚刚测试过它,当应用程序崩溃时它再次调用Application.OnCreate。
我希望有所帮助。
答案 3 :(得分:0)
@Override onPause
,然后使用finish();
答案 4 :(得分:0)
Application
类用于初始化全局变量 - 因此您可以正确使用此部分。但是,您必须在另一个类中声明这些变量,因为只有在应用程序重新启动时才会调用Application
- 而不是在它在后台时。
您还应该使用Application
的{{1}}方法(使用onCreate()
注释)进行这些初始化。
答案 5 :(得分:0)
我遇到了类似的问题,基本上这篇文章很好地解释了http://www.developerphil.com/dont-store-data-in-the-application-object/
这是关键段落以及发生在你身上的事情:
这将我们带到了问题的核心:应用程序对象永远不会留在内存中,它会被杀死。与流行的看法相反,该应用程序将不会从头开始重新启动。 Android将创建一个新的Application对象并启动用户之前的活动,以便首先假定该应用程序从未被杀死。
我知道这篇文章已经过时但认为这可能会对将来的用户有所帮助。