我怀疑ServiceManager注册的服务而不是SystemServiceRegistry注册。
的评论中/**
* Manages all of the system services that can be returned by {@link Context#getSystemService}.
* Used by {@link ContextImpl}.
*/
这意味着System注册的服务可以从Context获得他的参考。
关注ServiceManager,如何在未经SystemServiceRegistry注册的应用程序中访问ServiceManager添加的服务?
答案 0 :(得分:3)
这个答案真的很晚,但是访问隐藏类ServiceManager上的方法的另一种方法是使用反射。由于类上的所有方法都是静态的,因此您不需要将对象引用传递给invoke方法。您只需传入类实例即可。为了在隐藏类上获取类实例,您可以使用更多的反射。 例如:
Some[List[Nothing]]
这几乎是访问隐藏或私有方法所需要做的全部内容(虽然使用私有方法,但您需要修改方法的访问权限)。 我知道Android中的反射很糟糕,并且它们通常是一些很好的理由,为什么某些API没有暴露但是有一些有效的用例可以使用它。如果您没有大量调用反映的代码,那么性能损失并不可怕,如果您这样做,您可以缓存这些方法,这样您就不必在每次调用时执行查找。话虽如此,如果您确实需要访问非公开API,请小心并分析。
答案 1 :(得分:0)
正如@CommonsWare正确提到的,您需要在上下文中使用getSystemService()。 例如。获取位置服务:
LocationManager mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
对于您的自定义服务使用(假设您的服务已在AndroidManifest.xml中注册):
startService(new Intent(this, YourServiceClass.class));