AndroidシステムにおけるgetServiceとgetSystemServiceの違い

2131 ワード

出典
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方法を使用することができる.