在Application.OnCreate()VS Service中注册ContentObserver

bar*_*use 6 android xamarin.android xamarin

我需要我的应用程序来监控(和解析)拨出电话(以及其他内容).

  • 有一个广播"NEW_OUTGOING_CALL",但它在启动呼叫时被触发,我需要知道它何时实际完成.
  • 为此,我可以创建一个PhoneStateListener并听取"LISTEN_CALL_STATE",但由于呼叫尚未在呼叫日志数据库中,它会再次被解雇.(我可以启动一个计时器,但是... beurk ..)
  • 最后,我可以ContentObserver在CallLog URI上放一个(并摆脱多个调用)并检测新条目.

这实际上是我想要做的(第三种选择),但为此我当然需要注册我的ContentObserver,因此问题是:我应该在何时何地注册?

显然,答案似乎是:在Service... 之内
但是什么时候开始服务?

  • 我需要在我的应用程序启动时赶上缺少的条目,所以我需要从所有"可调用"活动启动服务......这里需要手动打开应用程序,重启后可能会出现问题.
  • 每当进行新的调用时我都需要它:可以使用BroadcastListeneron"NEW_OUTGOING_CALL" 来实现,如果服务尚未开启则启动服务.摆脱重启问题(只要应用程序已经启动一次而不是用户杀死)

但是在注册内部会出现什么问题Application.OnCreate() 呢?

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

那么注册ContentObserver有什么不对吗Application.OnCreate()或使用a的优势Service是什么?

更新:

在亲服务上我会发现:

  • 如果我希望我的应用程序在boot_time启动,我用我的BroadcastReceiver权利听"BOOT_COMPLETED" ?所以我的进程将被创建,我可以注册我的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:服务流程",它将不再被清理(至少不会立即...)所以如果稍后我启动应用程序,这个过程已经在这里,安静地听...