Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android如何将AIDL接口和远程服务连接起来?_Java_Android_Service_Aidl - Fatal编程技术网

Java Android如何将AIDL接口和远程服务连接起来?

Java Android如何将AIDL接口和远程服务连接起来?,java,android,service,aidl,Java,Android,Service,Aidl,为了避免关于如何在您自己的项目中实现AIDL的无用回答,我了解如何在您自己的项目中使用AIDL 我不清楚的是它是如何在Android源代码中使用的 例如,在android.media包中有IAudioService AIDL接口。 还有AudioService java文件。还有很多例子,其中接口在IIinterfaceServiceName.aidl中定义,实现在InterfaceServiceName.java中。所以,我认为AIDL的内部成员会查找名称不带首字母I的服务,然后使用它。然而,

为了避免关于如何在您自己的项目中实现AIDL的无用回答,我了解如何在您自己的项目中使用AIDL

我不清楚的是它是如何在Android源代码中使用的

例如,在android.media包中有IAudioService AIDL接口。 还有AudioService java文件。还有很多例子,其中接口在IIinterfaceServiceName.aidl中定义,实现在InterfaceServiceName.java中。所以,我认为AIDL的内部成员会查找名称不带首字母I的服务,然后使用它。然而,这一理论被IWifiManager和WifiService推翻

然而,所有这些AIDL实现都有一个共同点——它们都扩展了IIinterfaceName.Stub类。这意味着AIDL内部寻找扩展IIinterfaceName.Stub的类?但是如果有多个类扩展它呢?那些课程根本不是服务

或者有一个服务管理器,它以某种方式使用这些AIDL实现作为绑定器来创建服务?如果是这样,请告诉我这个神秘的服务经理

编辑:我找到了这个服务经理。它是android.os包中的ServiceManager。现在可以理解为什么那些SomethingService实际上不是服务,而是IBinder——服务管理器通过addservice(String,IBinder)方法以某种方式使用给定的IBinder创建服务。但现在混乱只会变得更糟。
此服务的实现还存在于某种奇怪的ServiceManagerActive中,它涉及到未知IBinder的远程事务。现在我完全迷路了。那么这个ServiceManager是如何启动的呢?it如何增加服务

ServiceManager没有随机值,而是预定义的值。它是绑定句柄等于0的服务。在系统ServiceManager引导期间,它是系统启动的第一批服务之一(您可以在
init.rc
文件中对此进行检查)。Binder只允许一个服务充当名称解析程序。系统中启动的所有其他服务都已向ServiceManager注册

IAudioService.aidl定义了对其他进程可见的公共方法。在编译期间,从.aidl生成一个接口IAudioService,您可以在其中找到存根类:

public static abstract class Stub extends android.os.Binder implements android.media.IAudioService{
现在,类AudioService扩展了这个存根

public class AudioService extends IAudioService.Stub implements OnFinished {
android主文件夹中所有提到的文件的位置:

./frameworks/base/media/java/android/media/IAudioService.aidl
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java/android/media/IAudioService.java
./frameworks/base/media/java/android/media/AudioService.java

试着读一下你没有读问题的第一句,是吗?我对如何在我的应用程序中实现AIDL不感兴趣-我知道怎么做。相反,我试图了解Android系统服务和AIDL-like-IWifiManager是如何连接起来的。因此,您对sidl本身没有任何问题,但希望了解Android的内部结构,对吗?是的,没错。我已经追踪到了所有本机调用,但后来我迷失在了所有这些本机调用中。我不知道这是否有帮助,但现在你提到了aidl,客户端不必使用生成的东西,它可以直接调用IBinder的transact()方法谢谢。由于没有其他答案,评论也没有那么大帮助,我会认为这个答案是正确的。如果你愿意,你可以问更多的问题,如果我能回答,我会尝试回答。嗯,我想知道,我在哪里可以找到ServiceManager连接的所有远程服务的别名?我注意到这是一个超过一年的问题,但也许有一天其他人会发现它很有用。