【问题标题】:Keeping reference of an object for a task's lifetime在任务的生命周期内保持对象的引用
【发布时间】:2014-08-11 06:48:25
【问题描述】:

我正在寻找一种方法来保持对作为服务成员对象的对象/实例的引用。我知道在活动的情况下,我们可以通过提供的onSaveInstance 方法保存它。但是,我找不到任何类似的服务方式。

我可以使用静态对象,但它不安全,因为没有保证,如果下次引用有效,则创建服务。

另一种可能的方式是,我将所有数据存储在存储中,稍后再次创建服务时,我可以从存储中读取数据。然后遍历另一个类提供的信息/数据并找到从存储中读取的信息的相关参考,我认为这在执行时间方面非常昂贵。

所以我正在寻找一种方法来摆脱所有这些过程并在任务/​​应用程序运行时在内存中保留一个强引用(服务中的对象)。

问候

【问题讨论】:

  • 你为什么不尝试使用应用程序类?这将在应用程序运行期间保留数据。像这样的东西stackoverflow.com/questions/4208886/…
  • 你为什么不喜欢使用静态引用?如果需要,您可以重新初始化它们......只要进程存在,它们就会一直存在,就像 Application 类一样。
  • @androiddeveloper 根据我的经验,静态变量在关键内存条件下会被销毁(即使任务处于活动状态但其进程或服务被终止)。我将测试 Application 类作为静态对象的替代品
  • @UmerFarooq 如果进程被杀死,则任务和服务被杀死。应用程序的所有内容都被杀死。唯一剩下的可能是您可以通过最近的任务重新打开应用程序。并且它可能发生在低内存情况下是正确的,例如当您打开内存密集型应用程序时。扩展应用程序等同于使用静态引用(就存储变量而言),因为只要进程存在,它就会存在 - 它在进程存在时被实例化。唯一的区别是它在创建 contentProvider 时不能正常工作(它不会创建它的实例)。
  • @UmerFarooq 您甚至可以在此处阅读 Application 类的工作原理(如我所写):developer.android.com/reference/android/app/… 和此处:developer.android.com/reference/android/app。他们说如果你需要一个 singleTon,你通常不需要使用这个类,这也意味着你也不需要它作为静态引用。

标签: android service reference


【解决方案1】:

您可以使用应用程序类将数据持久化为

public class MyApplication extends Application 
{     
     public MyDataClass data = new MyDataClass();
}

然后通过以下方式在任何活动/服务中调用它:

MyApplication appState = ((MyApplication)this.getApplication());
appState.data.useAGetterOrSetterHere(); // Do whatever you need to with the data here.

在您的清单中提及如下::

<application android:name="yourpkgname.MyApplication"/>

更多信息就像

Application对象是一个生命周期与我们的Application相同的对象。

当应用程序启动时,这个对象由 Android 框架自动创建。

当您希望在应用程序的多个活动之间共享数据或希望在应用程序级别保留某些内容时。在这种情况下,您可以使用 Application 对象作为应用程序的全局存储。

【讨论】:

  • 保存到应用程序类通常与保存到静态变量相同。
  • 不,不是。如果需要内存,静态变量将被回收,但应用程序变量将在应用程序生命周期中保持不变。
  • 你有这方面的证据吗?我已经在这里询问过这个完全相同的区别:stackoverflow.com/a/19866181/878126。我什至记得用户“CommonsWare”在某处告诉我,只要进程处于活动状态,静态变量就应该保留。
  • 另外,可以的一个原因是文档说可以使用静态变量(或 singleTon,显然使用静态引用)在活动之间共享数据:developer.android.com/guide/faq/framework.html#3。拥有应用程序类还有其他用途,但如果您只想在全局范围内使用它们并且只要进程存在,那么您实际上不必将变量放在那里。
  • 除了请分享之外,您还有其他解决方案吗?
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多