這個答案真的是遲,但另一種方式來訪問的方法隱藏的類ServiceManager正在使用反射。由於類中的所有方法都是靜態的,因此不需要傳入調用方法的對象引用。你可以簡單地傳入類實例。爲了獲得隱藏類的類實例,可以使用更多的反射。 例子:
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。
「ServiceManager」和「SystemServiceRegistry」都不是Android SDK的一部分。如註釋所示,使用'Context'上的'getSystemService()'來檢索系統服務。 – CommonsWare
是的,但我正在查找未由系統註冊並由ServiceManager添加的服務。上下文無法爲我解決它。 – Andriel
對'getSystemService(「service_name」)'try/catch'調用並檢查該調用是否返回系統服務的句柄!= null ... _「服務未由系統註冊並且由ServiceManager添加「_ AFAIK添加服務與在」ServiceManager「中註冊服務相同。 – Onik