2010-01-12 53 views
1

我已经在我的应用程序中注册了一个BOOT_COMPLETED接收器,我想监听SMS数据库的更改。如何通过Boot_completed接收器通知您的(未启动的)应用程序?

BroadcastReceiver启动一个注册ContentObserver的临时服务。 现在我想通知我的主要活动(未开始)观察员注册成功。 (我想这样做,因为如果用户第一次安装应用程序,他不会重新启动他的手机,但也需要ContentObserver。如果您有另一个想法如何做到这一点,您可以发布它,我只是想观察者已经被注册)信息

我的想法是,通知与静态属性活动: MyActivity.sObserverRegistered =真

但我认为这是不好的,不会因为活动ISN工作没有开始,这被忽略。任何想法如何解决这个问题?

谢谢

回答

1

你有比这个更大的问题。

我要听的短信 数据库更改。

在Android SDK中没有“短信数据库”,甚至短信内容提供商。试图访问私有专有未公开的未公开的未被记录的短信应用程序内容将在某些设备上中断,未来的Android版本将中断,不会与第三方SMS应用程序一起工作,并且通常是一个糟糕的主意。

BroadcastReceiver启动 临时服务,该服务注册了 ContentObserver。

有没有这样的事情作为临时Service其中注册ContentObserver

可能是因为Service不是临时的,所以您的ContentObserver保持注册状态,并且您的Service未关闭。例如,如果您的BroadcastReceiver调用startService()而您的Service未调用stopSelf()(例如,它不是IntentService),则会发生此情况。这并不好,因为你现在正在制定一个流程。但是,如果你能说服你的用户确信你正在绑定一个流程,这是最好的答案,并且你的活动可以在活动启动时重新启动服务,以确保ContentObserver是注册。

这可能是因为您的ContentObserver未注册很长时间,因为当Service关闭时,临时Service将立即取消注册,并且服务立即关闭。从内存消费的角度来看,这很棒,但它对于你的目标可能并不是那么有效。

或者,您可能正在泄漏内存,因为您注册了ContentObserver并关闭了Service而未取消注册ContentObserver。这太可怕了,因为ContentObserver将被清除的唯一方式是Android终止该过程。此外,只要感觉像这样,它会这样做,因为就其而言,尽管线程和ContentObserverService泄漏了,但您不再使用该过程。这最终会导致不可靠的代码。

+0

谢谢,我会保持业务正常运行,并且活动开始时,然后再用它。它使用stopSelf(),它会导致你提到的问题。 由于“短信内容提供商”的另一点:我搜索了很长时间的解决方案,并没有适当的记录解决方案。但是,这是唯一的解决方案,我知道与URI“content://短信”的ContentProvider。目前它适用于所有设备,但必须留在未来的眼中 – ludwigm 2010-01-12 23:54:49

相关问题