gpt4 book ai didi

android - 如何从 Android 中的 ServiceManager 获取服务?

转载 作者:行者123 更新时间:2023-11-29 15:02:58 25 4
gpt4 key购买 nike

我对由 ServiceManager 注册而不是由 SystemServiceRegistry 注册的服务有疑问。

SystemServiceRegistry 的评论中

/**
* Manages all of the system services that can be returned by {@link Context#getSystemService}.
* Used by {@link ContextImpl}.
*/

这意味着系统注册的服务可以从上下文中得到他的引用。

关注ServiceManager ,我如何访问 ServiceManager 在未由 SystemServiceRegistry 注册的应用程序中添加的服务?

最佳答案

这个答案确实晚了,但是访问隐藏类 ServiceManager 上的方法的另一种方法是使用反射。由于类中的所有方法都是静态的,因此您不需要将对象引用传递给 invoke 方法。您可以简单地传入类实例。为了获得隐藏类的类实例,您可以使用更多的反射。示例:

Class localClass = Class.forName("android.os.ServiceManager");
Method getService = localClass.getMethod("getService", new Class[] {String.class});
if(getService != null) {
Object result = getService.invoke(localClass, new Object[]{Context.AUDIO_SERVICE});
if(result != null) {
IBinder binder = (IBinder) result;
// DO WHAT EVER YOU WANT AT THIS POINT, YOU WILL
// NEED TO CAST THE BINDER TO THE PROPER TYPE OF THE SERVICE YOU USE.
}
}

这几乎是访问隐藏或私有(private)方法所需要做的全部工作(尽管使用私有(private)方法,您需要修改方法的访问权限)。我知道反射在 Android 中是不好的,它们通常是某些 API 未公开的充分理由,但有一些有效的用例可以使用它。如果您不经常调用反射代码,性能影响并不严重,如果您是,您可以缓存这些方法,这样您就不必在每次调用时都执行查找。话虽如此,如果您真的需要访问非公共(public) API,请小心并分析。

关于android - 如何从 Android 中的 ServiceManager 获取服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com