6

我需要我的应用程序来监控(和解析)拨出电话(除其他外)。

  • 该“NEW_OUTGOING_CALL”有一个广播,但在开始通话时会被触发,我需要知道它何时真正完成。
  • 为此,我可以创建一个PhoneStateListener并收听“LISTEN_CALL_STATE”,但是由于呼叫尚未在呼叫日志数据库中,因此它再次被触发太快了。(我可以启动一个计时器但是.. beurk..)
  • 最后,我可以ContentObserver在 CallLog URI 上放置一个(并摆脱多个调用)并检测新条目。

这实际上就是我想要做的(第三个选项),但为此我当然需要注册我的 ContentObserver,因此问题是:我应该在哪里以及何时注册它?

显然,答案似乎是:在Service..
但是什么时候启动服务呢?

  • 我需要它在我的应用程序启动时赶上丢失的条目,所以我需要从所有“可调用”活动中启动服务......这里需要手动打开应用程序,重启后可能会出现问题。
  • 每当拨打新电话时我都需要它:可以通过BroadcastListener“NEW_OUTGOING_CALL”来实现,如果服务尚未启动,则启动服务。在这里摆脱重启问题(只要应用程序已经启动一次并且从那时起没有被用户杀死)

但是在 中注册它们会有什么问题Application.OnCreate()

  • 我已经需要对应用程序进行子类化(或者至少这是我处理其他事情的方式)
  • 据我了解,Application.OnCreate()无论如何都会在Activity创建我的一个(第一次)或我的BroadcastReceiver(重新启动后)启动服务时调用,任何需要我的进程启动的东西......
  • Service只要我的过程存在,它也会存在。
  • 我不需要额外Service的,不必绑定,启动等......

那么注册 ContentObserver 有什么问题吗,Application.OnCreate()或者使用 a 有什么好处Service

更新 :

在专业服务上,我刚刚发现:

  • 如果我希望我的应用程序在 boot_time 启动,我用我的权利听“BOOT_COMPLETED” BroadcastReceiver?所以我的进程将被创建,我可以注册我的ContentObservers......但它会很快被销毁:

    07-24 15:44:50.260: I/ActivityManager(531): No longer want com.test.test (pid 1829): empty #17

那是因为 Android 将其标记为"Level 5 : Empty process"。为什么 ?因为注册 ContentObservers 不会使我的流程“不为空”。
另一方面,启动服务使我的进程成为“Level3:服务进程”并且它不会再被清理(至少不会立即......)所以如果稍后我启动应用程序,该进程已经在这里,悄悄地听...

4

0 回答 0