我有一个扩展android.os.Handler
的类。此处理程序的一个实例传递给Messenger
的构造函数。 Messenger
中的IBinder
的getBinder
作为onBind
事件在我的服务中传递的结果。通过绑定(bind)器从远程应用程序发送的消息确实会转到处理程序的handleMessage
方法,但是对Binder.getCallingUid
中的Binder.getCallingPid
和handleMessage
的调用始终返回服务进程的uid和pid(与远程应用程序绝对不是同一进程)。 handleMessage
绝对是IPC事务的一部分,不是吗?那我哪里出问题了?我需要使用它来进行连接应用程序的身份验证。
提前致谢。
编辑
好的。我感到这种可怕的感觉是handleMessage
不属于IPC事务,因为这发生在AIDL的单独线程中,该线程将消息放入Messenger
的队列中。还有其他方法来获取调用者的用户ID和进程ID吗?
最佳答案
创建一个自定义的Handler
类并覆盖sendMessageAtTime
(这是Handler
类中唯一可重写的发布方法),然后使用它来创建从Messenger
返回的onBind
。
在sendMessageAtTime
方法中,您可以通过getCallingPid
和getCallingUid
获取正在调用的远程应用程序的pid/uid。
但是,在IPC中,使用Messenger
而不是使用AIDL,由于远程应用程序发送的消息是异步的,因此getCallingPid
将始终返回0。使用IBinder.FLAG_ONEWAY
进行交易。
因此,uid是唯一可用的信息。