我已在我的应用程序中注册了BOOT_COMPLETED Receiver,我想收听SMS数据库的更改。
BroadcastReceiver启动一个临时服务,该服务注册ContentObserver。 现在我想通知我的主要活动(未启动)Observer注册成功。 (我想这样做,因为如果用户第一次安装应用程序,他不会重新启动手机,但也需要ContentObserver。如果您有其他想法,可以发布它。我只想要这些信息观察者已经注册了)
我的想法是使用静态属性通知活动: MyActivity.sObserverRegistered = true
但我认为这不好并且不起作用,因为活动没有开始,这被忽略了。知道如何解决问题吗?
感谢
答案 0 :(得分:1)
你有比这更大的问题。
我想听听短信的变化 数据库中。
Android SDK中没有“SMS数据库”,甚至是SMS内容提供商。尝试访问私有专有的未记录的不被触摸的SMS应用程序内容将在某些设备上中断,将在未来版本的Android中断,将无法与第三方SMS应用程序一起使用,并且通常是一个坏主意。
BroadcastReceiver启动了 注册的临时服务 ContentObserver。
没有注册Service
的临时ContentObserver
。
Service
可能不是临时的,因此您的ContentObserver
仍然已注册且Service
未关闭。例如,如果您的BroadcastReceiver
调用startService()
而您的Service
未调用stopSelf()
(例如,它不是IntentService
),则会发生这种情况。这不是很好,因为你现在正在追平一个过程。但是,如果您可以说服您的用户说您正在捆绑流程,那么这是最好的答案,您的活动可以在活动启动时(重新)启动服务,以确保{{ 1}}已注册。
可能是您的ContentObserver
注册时间过长,因为临时ContentObserver
会在Service
关闭后立即取消注册,并立即关闭服务。从记忆消耗的角度来看,这很好,但它可能对你的目标没那么有效。
或者,可能是您正在泄漏内存,因为您注册了Service
并关闭了ContentObserver
而未注销Service
。这太可怕了,因为ContentObserver
将被清除的唯一方法是Android终止进程。此外,它会在感觉到的时候执行此操作,因为就您而言,尽管线程ContentObserver
和ContentObserver
已泄露,但您不再使用该过程。这最多会导致代码不可靠。