Android 如何从启动完成的接收器通知您的(未启动)应用程序?

Android 如何从启动完成的接收器通知您的(未启动)应用程序?,android,Android,我已经在我的应用程序中注册了一个启动完成的接收器,我想监听SMS数据库上的更改 BroadcastReceiver启动注册ContentObserver的临时服务。 现在,我想通知我的主要活动(尚未启动)观察员注册成功。 (我想这样做,因为如果用户第一次安装应用程序,他不会重新启动手机,但也需要ContentObserver。如果你有其他想法,可以发布。我只想知道observer已经注册的信息) 我的想法是使用静态属性通知活动: MyActivity.sObserverRegistered=tr

我已经在我的应用程序中注册了一个启动完成的接收器,我想监听SMS数据库上的更改

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

我的想法是使用静态属性通知活动: MyActivity.sObserverRegistered=true

但我认为这不好,也不起作用,因为活动没有开始,这被忽略了。你知道怎么解决这个问题吗


谢谢

你还有比这更大的问题

我想在短信息上收听更改 数据库

Android SDK中没有“短信数据库”,甚至没有短信内容提供商。试图访问私人专有的未记录禁止触摸短信应用程序内容将在某些设备上中断,在未来的Android版本中中断,无法与第三方短信应用程序一起使用,通常是一个坏主意

广播接收器启动一个 临时服务,登记 内容观察者

没有注册
ContentObserver
的临时
服务

可能是
服务
不是临时的,因此您的
ContentObserver
保持注册状态,并且您的
服务
没有关闭。例如,如果您的
BroadcastReceiver
调用了
startService()
,而您的
Service
没有调用
stopSelf()
(例如,它不是
IntentService
)。这不是很好,因为您现在正在占用一个过程。但是,如果您能让用户相信您正在绑定一个流程是可以的,那么这就是最好的答案,并且您的活动可以在活动启动时(重新)启动服务,以确保注册
ContentObserver

这可能是因为您的
ContentObserver
注册时间不长,因为当
服务关闭时,临时
服务会立即注销它,并且该服务会立即关闭。从内存消耗的角度来看,这是很好的,但是对于你的目标来说,它可能并不那么有效


或者,可能是您正在泄漏内存,因为您注册了
ContentObserver
,并在未注销
ContentObserver
的情况下关闭了
服务。这太可怕了,因为清理
ContentObserver
的唯一方法就是Android终止进程。此外,它会在任何时候这样做,因为就它而言,您不再使用该进程,尽管您泄漏了线程和
ContentObserver
服务。这最多只会导致不可靠的代码。

您还有更大的问题

我想在短信息上收听更改 数据库

Android SDK中没有“短信数据库”,甚至没有短信内容提供商。试图访问私人专有的未记录禁止触摸短信应用程序内容将在某些设备上中断,在未来的Android版本中中断,无法与第三方短信应用程序一起使用,通常是一个坏主意

广播接收器启动一个 临时服务,登记 内容观察者

没有注册
ContentObserver
的临时
服务

可能是
服务
不是临时的,因此您的
ContentObserver
保持注册状态,并且您的
服务
没有关闭。例如,如果您的
BroadcastReceiver
调用了
startService()
,而您的
Service
没有调用
stopSelf()
(例如,它不是
IntentService
)。这不是很好,因为您现在正在占用一个过程。但是,如果您能让用户相信您正在绑定一个流程是可以的,那么这就是最好的答案,并且您的活动可以在活动启动时(重新)启动服务,以确保注册
ContentObserver

这可能是因为您的
ContentObserver
注册时间不长,因为当
服务关闭时,临时
服务会立即注销它,并且该服务会立即关闭。从内存消耗的角度来看,这是很好的,但是对于你的目标来说,它可能并不那么有效


或者,可能是您正在泄漏内存,因为您注册了
ContentObserver
,并在未注销
ContentObserver
的情况下关闭了
服务。这太可怕了,因为清理
ContentObserver
的唯一方法就是Android终止进程。此外,它会在任何时候这样做,因为就它而言,您不再使用该进程,尽管您泄漏了线程和
ContentObserver
服务。这最多只能导致不可靠的代码。

谢谢,我将保持服务运行,然后在活动开始时重新使用它。它使用了stopSelf(),这导致了您提到的问题。另一点是因为“短信内容提供商”:我搜索了很长时间的解决方案,并没有合适的文档解决方案。但这是我所知道的唯一一个在URI上使用ContentProvider的解决方案”content://sms" . 目前,它可以在所有设备上运行,但必须时刻关注未来,我将保持服务运行,然后在需要时重新使用它