在 Android 服务中注册 ContentObserver

Posted

技术标签:

【中文标题】在 Android 服务中注册 ContentObserver【英文标题】:Registering a ContentObserver in a Android Service 【发布时间】:2011-08-03 16:17:10 【问题描述】:

我正在开发家长控制/成人内容过滤应用程序。该应用程序持续监控孩子手机上的通话和短信,并将所有活动记录到服务器上。为此,我正在启动一项服务(MyService.java) 在 BOOT_COMPLETED 和服务的 onCreate 方法中,我为 callLog 和 sms uri 注册了一个 contentobserver(请参阅下面的代码 sn-p)。

现在的问题是,由于我想监控每一个呼出、呼入和短信,我希望服务能够持续运行(不会被停止/杀死)。此外,该服务仅用于注册内容观察者而不进行任何其他处理(其 OnstartCommand 方法是 dummy ),因此 android 操作系统会在一段时间后终止该服务。 如何确保服务持续运行并保持 contentobserver 对象处于活动状态?

公共类 MyService 扩展服务 私人 CallLogObserver clLogObs = null; 公共无效 onCreate() 超级.onCreate(); 尝试 clLogObs = new CallLogObserver(this); this.getContentResolver().registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, true, clLogObs); catch(异常前) Log.e("CallLogData", ex.toString()); @覆盖 公共 IBinder onBind(Intent arg0) // TODO 自动生成的方法存根 返回空值; @覆盖 公共无效 onDestroy() 如果(clLogObs!=null) this.getContentResolver().unregisterContentObserver(clLogObs); super.onDestroy(); @覆盖 public int onStartCommand(Intent intent, int flags, int startId) super.onStartCommand(intent, flags, startId); 返回服务。START_STICKY; @覆盖 公共布尔onUnbind(意图意图) 返回 super.onUnbind(intent);

【问题讨论】:

人们已经评论过您如何无法保持服务运行,但是,因为听起来服务只是注册了 ContentObservers,听起来真正的问题是这些观察者是否在服务运行时保持注册状态杀死(我相信他们会这样做)以及如果服务重新启动,如何避免重新注册新的观察者实例。 【参考方案1】:

您无法确保您的服务在 Android 上持续运行。

对于您提到的用例,最好依赖广播接收器,例如 ACTION_NEW_OUTGOING_CALL 和 SMS_RECEIVED。

如果您觉得,上述支持的广播接收器并不能涵盖您的所有用例。使用 AlaramManager 定期启动您的 SERVICE 并查看 CALL_LOGS 和 SMS 表中的任何数据更改并采取适当的措施(这可能涉及检查在 CALL_LOGS 和 SMS 表上标记上次访问的数据)。

【讨论】:

谢谢苏库玛。由于android不允许服务不间断地运行,因此必须根据广播接收器重新设计应用程序。【参考方案2】:

您可以将服务设置为在前台运行。这将使您的服务被操作系统杀死的机会要低得多。

阅读here了解更多信息。

【讨论】:

【参考方案3】:

一旦你的服务被终止,内容观察者就会被取消注册。因此,注册一次不是一种选择,您的服务必须一直在运行。为了保证这一点,您必须从 onStartCommand 返回 START_STICKY。您也可以在前台启动服务。

但是如果服务被终止时有一个新的调用到达怎么办?要处理此问题,您可以将最后处理的 _id 存储在应用程序的首选项中。并且每次获取所有新的通话记录,其 id 大于保存的 id。您必须处理服务 onCreate 和观察者 onChange 上的日志。

【讨论】:

【参考方案4】:

你不能保证它会持续运行,但你可以从 onStartCommand 返回 START_STICKY ,这保证了 Android 会在它因任何原因被杀死时重新启动你的服务。

【讨论】:

以上是关于在 Android 服务中注册 ContentObserver的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“服务未注册”异常,即使我没有在 Android - Java/Kotlin 中使用任何服务?

Android如何注册服务到ServiceManager?

android 学习随笔十八(广播与服务 )

Android Binder原理系统服务的注册过程

Android GCM:如何在我自己的服务器中检测注册的规范 ID?

Android Framework原理 -- service_manager注册服务流程分析