19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.BinderInternal;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** @hide */
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class ServiceManager {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "ServiceManager";
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static IServiceManager sServiceManager;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static IServiceManager getIServiceManager() {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sServiceManager != null) {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sServiceManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Find the service manager
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sServiceManager;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a reference to a service with the given name.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the service to get
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a reference to the service, or <code>null</code> if the service doesn't exist
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBinder getService(String name) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder service = sCache.get(name);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (service != null) {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return service;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getIServiceManager().getService(name);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "error in getService", e);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Place a new @a service called @a name into the service
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * manager.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the new service
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param service the service object
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void addService(String name, IBinder service) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
72a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn            getIServiceManager().addService(name, service, false);
73a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn        } catch (RemoteException e) {
74a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn            Log.e(TAG, "error in addService", e);
75a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn        }
76a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn    }
77a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn
78a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn    /**
79a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * Place a new @a service called @a name into the service
80a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * manager.
81a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     *
82a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * @param name the name of the new service
83a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * @param service the service object
84a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * @param allowIsolated set to true to allow isolated sandboxed processes
85a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     * to access this service
86a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn     */
87a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn    public static void addService(String name, IBinder service, boolean allowIsolated) {
88a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn        try {
89a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn            getIServiceManager().addService(name, service, allowIsolated);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "error in addService", e);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve an existing service called @a name from the
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * service manager.  Non-blocking.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBinder checkService(String name) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder service = sCache.get(name);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (service != null) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return service;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getIServiceManager().checkService(name);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "error in checkService", e);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a list of all currently running services.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String[] listServices() throws RemoteException {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getIServiceManager().listServices();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "error in listServices", e);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is only intended to be called when the process is first being brought
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * up and bound by the activity manager. There is only one thread in the process
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at that time, so no locking is done.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cache the cache of service references
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void initServiceCache(Map<String, IBinder> cache) {
13410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown        if (sCache.size() != 0) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("setServiceCache may only be called once");
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sCache.putAll(cache);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
140