当应用程序进入后台时,它的静态实例可能会被清除吗?

Posted

技术标签:

【中文标题】当应用程序进入后台时,它的静态实例可能会被清除吗?【英文标题】:When application bring to background,it's static instance may be cleared? 【发布时间】:2011-11-30 03:33:12 【问题描述】:

Store application global data

有人说android会在任务进入后台时清除单例实例。 是真的吗?

我意识到当我试图杀死一个前台任务(通过使用 DDMS)时,应用程序会自动重启它。一定有一些守护进程,不是吗?

当然,重启前台应用程序对我来说是安全的,因为在进程重启时,我可以通过调用 Application 的 onCreate 来重新初始化我的应用程序。

但是我对后台任务/应用程序感到困惑。android会杀死后台任务并以与前台应用程序相同的方式重新启动它吗?(我尝试杀死后台应用程序,它在没有重新启动的情况下退出)。或者 dalvik 会清除并回收静态实例?

如果dalvik真的很清楚singlton,我该如何避免呢?

【问题讨论】:

【参考方案1】:

每个 Android 应用程序都在一个进程中运行。当一个任务(无论是后台还是前台)被杀死时,实际上该进程被杀死了。就像Java应用运行在JVM上一样,每个JVM实例就是一个进程。

dalvik 对象管理与 JVM 没有什么不同。我认为 dalvik 不会清除单例实例。没有引用的对象实例在 GC 上会被清除,但单例不应该。

在 Android 应用程序中,主线程是事件调度线程。它循环运行,将事件分派给适当的活动、小部件或服务。编写应用程序实际上是实现事件回调:您编写的代码中没有 main(),您永远不会拥有主线程,底层框架会在事件发生时调用您的代码。当任务转到后台时,即没有任何可见的活动,没有生成 UI 事件,因此您看到主线程正在事件队列中等待。文章Painless Threading 讨论了Android 应用程序使用的线程模型。

【讨论】:

另一个问题,前台任务和后台任务有什么区别?当前台任务变成后台任务时,我发现后台任务的主线程变成了等待。android框架还能做什么? :) 谢谢,我读过那篇文章。AsyncTask 有时让我很痛苦,例如***.com/questions/7034823/… .Handler 是管理一组任务的好方法,它使管理顺序或轻松防止重复。感谢您的帮助

以上是关于当应用程序进入后台时,它的静态实例可能会被清除吗?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序长时间返回后台并返回时,静态对象出现null问题

如何在后台清除应用程序的所有子视图

在java中,为啥类实例也能访问静态域?

当应用程序移动到后台时,android是不是会清除视图中的数据?

红米手机安卓后台服务被杀

当应用程序转到后台状态时,NSCache会删除其所有数据