在单例中使用 BroadcastReceiver 的最巧妙方法等等

Posted

技术标签:

【中文标题】在单例中使用 BroadcastReceiver 的最巧妙方法等等【英文标题】:Slickest way to use BroadcastReceiver in a singleton and more 【发布时间】:2010-09-17 14:51:17 【问题描述】:

我有一个单例,它存储有关我的应用程序用户的一些谨慎信息。目前,它存储用户的登录信息和用户的位置。

1) 该位置是通过服务找到的。目前,服务直接引用我的单例来将经度和纬度填充到其中。我想使用 BroadcastReceiver 来发送单例听到并用于更新值的广播。

但是,要注册 BroadcastReceiver,我需要在我的单例中添加一个 Context。实现我想要的最巧妙的方法是什么。 BroadcastReceiver 可能不是合适的对象吗?

2) 另外,我在使用单例时会遇到什么问题?我假设 android 可能会在任何给定时间回收此内存(这显然很糟糕);那么我该如何防止呢?传入应用程序的 Context 并将其存储在成员变量中会阻碍这一点吗?

Android 文档指出:“但是,静态对象的生命周期并不受您的控制;因此要遵守生命周期模型,应用程序类应在 onCreate() 中启动和拆除这些静态对象和应用程序类的 onTerminate() 方法”,但我不完全确定如何完成。

【问题讨论】:

【参考方案1】:

但是,要注册 BroadcastReceiver,我需要在我的单例中添加一个 Context。是什么 实现我想要的最巧妙的方法。 BroadcastReceiver 可能不是合适的 > 对象吗?

“最巧妙的方法”是不做你正在做的事。请仅从 ActivityService也许 Application 注册 BroadcastReceiver。当ActivityServiceApplication 被销毁时,您必须取消注册此BroadcastReceiver

我假设 Android 可能会在任何给定时间回收此内存(这将 显然是坏的);那我该如何预防呢?

你没有。 Android 保留随时终止您的进程的权利(例如,回收内存)。 Android 2.1 及更早版本的任务杀手将随时终止您的进程。一旦您的应用程序的所有组件都被销毁,Android 可能随时回收您的进程,同时清除您的堆。以此类推。

只把不介意丢失的东西放在记忆中。

最好将您的“应用程序”视为一篮子松散耦合的组件,而不是一个单一的实体。

会传入应用程序的上下文并将其存储在成员变量中 这个?

没有。

Android 文档指出:“但是,静态的生命周期并不完全在您的 控制;所以要遵守生命周期模型,应用程序类应该启动并 在 onCreate() 和 onTerminate() 方法中拆除这些静态对象 应用程序类”,但我不完全确定如何完成此操作。

创建Application 的子类,并通过<application> 元素上的android:name 属性在清单中指出Android 应该使用它。

【讨论】:

感谢您的意见。您如何推荐“随身携带”:此信息?您是否建议每次需要时都从数据库中读取它(假设“它”是通过 Web 服务传递的登录信息)? 是的,将其存储在数据库中或SharedPreferences 那么,您是否建议将我的单例与保存登录信息的成员变量一起保留,并在单例中创建一个方法来检索它们,该方法要么返回所要求的值,要么如果未设置(即:单例被销毁并重新创建),从数据库中读取,设置并返回? 为什么要滚动自己的单例而不是使用服务? 我对 Android 开发还很陌生。我知道服务避免被回收;这就是人们避免这个问题的方式吗?是不是很讨厌?

以上是关于在单例中使用 BroadcastReceiver 的最巧妙方法等等的主要内容,如果未能解决你的问题,请参考以下文章

如何在单例中传递参数

是否需要在单例类中使用弱引用?

详略。。设计模式2——单例变形(多例).。。。studying

PHP:单例与静态类 [重复]

带有核心数据对象的 NSArray 的单例 null

使用python中的构造函数限制在单例类中创建对象