Android的静态对象的生命周期Android的静态对象的生命周期(Android static

2019-05-08 20:53发布

我创建事件的搜索应用程序,我们在另一个屏幕设置搜索条件从一个屏幕填入然后用户可以编辑从3屏幕的搜索条件,进入第4个屏幕。

为了实现上述任务,我使用静态对象,记得在应用程序中的价值观和我不需要做额外的任何事情。

但恐怕如果是静态对象的生命周期中的Android,如果低内存发现删除Android静态对象???

由于Android支持多任务处理,如果用户切换到另一个应用程序,并在用户回来的应用开始行动疯狂,没有静态对象遭到移除时,多任务??? 任何的想法 ?? 并且还建议保持静态对象经由单的方法是较好的方法???

Answer 1:

当你启动应用程序,会发生什么:让我们开始有点背景?
在OS启动一个进程,并为其分配一个唯一的进程ID和分配过程table.A过程开始DVM(Dalvik虚拟机)的一个实例; 每个应用程序DVM内运行。
的DVM管理类加载卸载实例的生命周期,GC等。

一个静态变量的寿命:一个静态变量开始存在当一个类被JVM加载和当类被卸载死亡。

所以,如果你创建Android应用程序,并初始化静态变量,它会留在JVM中,直到发生以下情况之一:
1.类被卸载
2. JVM关闭
3.进程死亡

需要注意的是,当你切换到另一个应用程序的不同的活动,并没有上述三种情况的静态变量的值将持续存在。 如果上述任何三个发生静态就会失去它的价值。

你可以用几行代码测试:

  1. 打印您的活动的onCreate未初始化静态 - >应打印空
  2. 初始化静态。 打印 - >值将是非零
  3. 点击后退按钮,进入主屏幕。 注:主屏幕是另一项活动。
  4. 再次启动你的活动 - >静态变量将非空
  5. 从杀你DDMS应用程序(在设备窗口停止按钮)。
  6. 重新启动活动 - >静态会有空值。

希望帮助。



Answer 2:

那么,Singleton模式也是基于使用静态变量,所以实际上你会在相同的位置。 虽然静态的方法可能工作大多数时候,它可能会发生在某些情况下,当内存已满,其他活动需要前台之前,你的应用程序移动到它的下一个屏幕,你的活动的过程中可能会被杀死了,你失去的静态值。 但是,Android提供国家之间持续存在的值或者其中传输等几个选项:

  • 使用意向,你可以沿着你的搜索条件从一个活动传递到活动(类似于网页的http请求)
  • 使用应用程序首选项,你可以保存值,并在需要它们的活动进行检索
  • 使用SQLite数据库,你可以在一个表中坚持他们,后来他们找回
  • 如果你只是需要保存的活动状态,这样在重新启动的领域得到填补与先前选择的值,就可以实现的onSaveInstanceState()方法的活动 - 注意,这是不推荐持久化状态的活动之间进行。

您可以通过观察得到的喜好,意图和SQLite数据库的使用的一些代码示例盾盾的源代码树在谷歌代码或其他开源的Android应用程序。



Answer 3:

经过一番研究,事实证明,使用应用程序存储单身并没有很大的想法,除非你已经准备好重新创建它:

不要将数据存储在应用程序对象

因此,尽管接受的答案是技术上是正确的,它不提供的所有信息。

正如上面的链接提示,如果你真的想坚持这种模式,你需要准备,如果可能的检查null并重新创建数据。



Answer 4:

@ r1k0就在这里。 整个申请过程中杀死并重新启动一类的静态字段中存储的数据将不会在自己的坚持。 Android的常规杀死进程(正在运行的应用)时,它需要的内存。

每Android的文档: 活动状态和弹射从内存中 ,

该系统不会直接杀死的活动。 相反,它杀死该活动运行,破坏不仅活动,但一切在运行的过程,以及过程。

您可以保存并恢复原语的状态,以及使用下面的方法序列化和Parcelable对象。 这些都是正常的活动生命周期中自动调用。

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

所以,如果你有一个只有静态变量的一类,可以节省每个字段的onSaveInstanceState中()状态,并在onRestoreInstanceState恢复它们()。 当Android的杀死你的应用程序在运行的过程中,你的变量的状态将被保存,而当Android的恢复您的应用程序,该值将在内存中恢复之前,在相同的状态。



文章来源: Android static object lifecycle