如何在kill服务上处理DeadObjectException?

时间:2011-11-06 03:59:51

标签: java android exception

我的代码中有DeadObjectException。下面,我描述了我的设置,以及我试图解决的问题。


Service S Application A 开始。

Activity B (来自其他应用程序)使用MessengerIBinder接口与该服务进行通信。此活动也是从同一服务开始的。按下此按钮内的按钮,我应该将消息发送回服务。我经常按下按钮DeadObjectException

据我所知,最可能的原因是 - 系统被杀死并重新启动了该服务,并且该活动具有旧引用。除此之外,我还没有在网上找到太多的信息。

这就是我的尝试:

  • 我在服务中使用startForeground(),我可以看到该服务正在运行(通知区域中的通知)。我仍然有例外。
  • 在系统重启时,我暂时没有得到此异常。
  • 例外是间歇性的。我没有百分之百的责备。但是,在以下场景中,我总是得到异常:
    1. 启动应用A(这也是启动服务S)。
    2. 开始活动B,一切正常。
    3. 重新部署应用A。
    4. 重启服务
    5. 导航至活动B. 发生异常
    6. 此时,如果我重新启动活动B,则异常消失。
  • 这使我得出结论,如果我确保每次服务启动时活动B都是新鲜的,这个例外就会消失。然后我尝试在开始之前向活动B提供谋杀意图。 (活动有BroadcastReceiver,并在finish()中调用onReceive()。问题是,如果活动暂停,则Intent不会传递给它。此外,我看到onDestroy()被简单地命中,因为Android管理活动生命周期,因此无法保证将意图传递给它。我还尝试按照this stackoverflow question.
  • 中的提法扩展BaseActivity
  • 我还尝试设置FLAG_ACTIVITY_CLEAR_TASK(除了通常的FLAG_ACTIVITY_NEW_TASK),没有更好的结果。

现在,我觉得好像没有选择。有没有人遇到类似的问题?有什么我可以尝试的吗?是否可以捕获异常然后重新绑定服务?

1 个答案:

答案 0 :(得分:2)

在活动B中,实现IBinder.DeathRecipient接口(可能包含在自定义类中),并通过IBinder从您的服务中注册IBinder.linkToDeath()。当/ Service由于某种原因而死亡时,您的回调将被命中,而活动B可以优雅地清理任何内部的书籍,保留它并重新绑定到服务。