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

时间:2017-01-11 17:24:07

标签: android android-service system-services

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

SystemServiceRegistry

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

这意味着System注册的服务可以从Context获得他的参考。

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

2 个答案:

答案 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));