我的代码中有DeadObjectException
。下面,我描述了我的设置,以及我试图解决的问题。
Service
S 从Application
A 开始。
Activity
B (来自其他应用程序)使用Messenger
和IBinder
接口与该服务进行通信。此活动也是从同一服务开始的。按下此按钮内的按钮,我应该将消息发送回服务。我经常按下按钮DeadObjectException
。
据我所知,最可能的原因是 - 系统被杀死并重新启动了该服务,并且该活动具有旧引用。除此之外,我还没有在网上找到太多的信息。
这就是我的尝试:
startForeground()
,我可以看到该服务正在运行(通知区域中的通知)。我仍然有例外。BroadcastReceiver
,并在finish()
中调用onReceive()
。问题是,如果活动暂停,则Intent
不会传递给它。此外,我看到onDestroy()
被简单地命中,因为Android管理活动生命周期,因此无法保证将意图传递给它。我还尝试按照this stackoverflow question. BaseActivity
FLAG_ACTIVITY_CLEAR_TASK
(除了通常的FLAG_ACTIVITY_NEW_TASK
),没有更好的结果。现在,我觉得好像没有选择。有没有人遇到类似的问题?有什么我可以尝试的吗?是否可以捕获异常然后重新绑定服务?
答案 0 :(得分:2)
在活动B中,实现IBinder.DeathRecipient
接口(可能包含在自定义类中),并通过IBinder
从您的服务中注册IBinder.linkToDeath()
。当/ Service
由于某种原因而死亡时,您的回调将被命中,而活动B可以优雅地清理任何内部的书籍,保留它并重新绑定到服务。