我有一个Android服务,通过AIDL导出了一个RPC接口。这个接口是面向连接的,客户端将连接到它,与之交互,然后在退出时断开连接。
不幸的是,如果客户端异常退出,例如被系统杀死,它永远没有机会告诉RPC接口连接已经关闭。这造成了问题。
有没有办法让Service在新客户端附加和分离自己的接口时自动通知呢?我找到了onBind()和onUnbind(),但它们不是同一件事;它们告诉我接口是否正在使用中。只有当最后一个客户端分离时,onUnbind()才会被调用。
有什么想法吗?(服务的设计受外部要求控制,不能更改……)
更新:我完全忘记提到我看过linkToDeath(),它几乎做到了我想要的功能,但它似乎只能反向工作---它允许客户端在服务死亡时得到通知。当我尝试它时,似乎什么也没发生。文档有点不完整;有人确定这是否按照我想要的方式工作吗?如果是,如何让它告诉我哪个客户端死了?
更新更新:我解决了这个问题,但只是通过欺骗来解决的。我重新定义了它。我的应用程序实际上大部分是使用NDK编写的C语言,因此服务的设计有些奇怪;因此,我将问题移至C世界,并创建了一个小型辅助进程,使用Unix域套接字直接与我的应用程序的本地部分通信。它很快,非常小,几乎没有漏洞---但这仍然是欺骗。所以虽然我的问题现在已经解决,但我仍然想知道真正的答案是什么。
不幸的是,如果客户端异常退出,例如被系统杀死,它永远没有机会告诉RPC接口连接已经关闭。这造成了问题。
有没有办法让Service在新客户端附加和分离自己的接口时自动通知呢?我找到了onBind()和onUnbind(),但它们不是同一件事;它们告诉我接口是否正在使用中。只有当最后一个客户端分离时,onUnbind()才会被调用。
有什么想法吗?(服务的设计受外部要求控制,不能更改……)
更新:我完全忘记提到我看过linkToDeath(),它几乎做到了我想要的功能,但它似乎只能反向工作---它允许客户端在服务死亡时得到通知。当我尝试它时,似乎什么也没发生。文档有点不完整;有人确定这是否按照我想要的方式工作吗?如果是,如何让它告诉我哪个客户端死了?
更新更新:我解决了这个问题,但只是通过欺骗来解决的。我重新定义了它。我的应用程序实际上大部分是使用NDK编写的C语言,因此服务的设计有些奇怪;因此,我将问题移至C世界,并创建了一个小型辅助进程,使用Unix域套接字直接与我的应用程序的本地部分通信。它很快,非常小,几乎没有漏洞---但这仍然是欺骗。所以虽然我的问题现在已经解决,但我仍然想知道真正的答案是什么。