AndroidシステムにおけるgetServiceとgetSystemServiceの違い
2131 ワード
出典
getServiceはframeworks/base/core/java/android/os/serviceManagerからJAvaファイルの静的メソッド
同じ
アプリケーションは、PackageManagerService、Activity ManagerServiceなどのシステムの重要なサービスエージェントオブジェクトを取得し、関連するapiを呼び出すことができます.
区別する
ServiceManagerクラスはAndroidシステムhideのクラスであり、直接取得することはできないが、システムアプリケーションの開発においてはgetServiceメソッドを直接呼び出して対応するシステムサービスを取得できるエージェントオブジェクトであり、サービス対象の対応するメソッドを呼び出すために、システム権限を取得する必要があるshareUIDはandroidである.uid.Sysytemは、このメソッドを呼び出すとアクセス権がないと報告します.
ContextImplクラスはAndroid空間Activity,Service親クラスであり,コントロールを初期化する際に静的コードブロックを介してシステムサービスを登録する.
アプリケーションはcontext.getSystemServiceメソッドは、nameによって異なるサービスを取得するが、このサービスによって取得するシステムサービスエージェントは、Androidシステムの去勢を経たサービスであり、Androidシステムが安全ではないと判断する方法を隠している.例えば、PackageManager context.getSystemService(「package」)で取得したオブジェクトは、実はApplicationPackageManagerオブジェクトであり、PackageManager抽象クラスを継承し、ApplicationPackageManagerオブジェクトの初期化時にPackagerManagerServiceエージェントオブジェクト、すなわちApplicationPackageManagerでPackageManagerServiceのいくつかのメソッドの去勢を行う.例えばサービスのinstallPackageメソッドが隠されています.
まとめ
この2つの方法は非表示方法を使用しない場合に使用でき、システムアプリケーションを開発する場合はgetService方法を使用することができる.
getServiceはframeworks/base/core/java/android/os/serviceManagerからJAvaファイルの静的メソッド
public static IBinder getService(String name) {
try {
IBinder service = sCache.get(name);
if (service != null) {
return service;
} else {
return getIServiceManager().getService(name);
}
} catch (RemoteException e) {
Log.e(TAG, "error in getService", e);
}
return null;
}
getSystemServiceはframeworks/base/core/java/android/app/contextImplから来ています.JAvaメソッド、@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
同じ
アプリケーションは、PackageManagerService、Activity ManagerServiceなどのシステムの重要なサービスエージェントオブジェクトを取得し、関連するapiを呼び出すことができます.
区別する
ServiceManagerクラスはAndroidシステムhideのクラスであり、直接取得することはできないが、システムアプリケーションの開発においてはgetServiceメソッドを直接呼び出して対応するシステムサービスを取得できるエージェントオブジェクトであり、サービス対象の対応するメソッドを呼び出すために、システム権限を取得する必要があるshareUIDはandroidである.uid.Sysytemは、このメソッドを呼び出すとアクセス権がないと報告します.
ContextImplクラスはAndroid空間Activity,Service親クラスであり,コントロールを初期化する際に静的コードブロックを介してシステムサービスを登録する.
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
アプリケーションはcontext.getSystemServiceメソッドは、nameによって異なるサービスを取得するが、このサービスによって取得するシステムサービスエージェントは、Androidシステムの去勢を経たサービスであり、Androidシステムが安全ではないと判断する方法を隠している.例えば、PackageManager context.getSystemService(「package」)で取得したオブジェクトは、実はApplicationPackageManagerオブジェクトであり、PackageManager抽象クラスを継承し、ApplicationPackageManagerオブジェクトの初期化時にPackagerManagerServiceエージェントオブジェクト、すなわちApplicationPackageManagerでPackageManagerServiceのいくつかのメソッドの去勢を行う.例えばサービスのinstallPackageメソッドが隠されています.
まとめ
この2つの方法は非表示方法を使用しない場合に使用でき、システムアプリケーションを開発する場合はgetService方法を使用することができる.