当前位置:  开发笔记 > Android > 正文

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

如何解决《如何从Android中的ServiceManager获取服务?》经验,为你挑选了1个好方法。

我怀疑由ServiceManager注册的服务而不是由SystemServiceRegistry注册的服务。

在SystemServiceRegistry的评论中

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

这意味着可以从上下文中获取由System注册的服务。

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



1> Wade Wilson..:

这个答案确实很晚,但是访问隐藏类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.
   }
}

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有