| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.os; |
| |
| import com.android.internal.os.BinderInternal; |
| |
| import android.util.Log; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** @hide */ |
| public final class ServiceManager { |
| private static final String TAG = "ServiceManager"; |
| |
| private static IServiceManager sServiceManager; |
| private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>(); |
| |
| private static IServiceManager getIServiceManager() { |
| if (sServiceManager != null) { |
| return sServiceManager; |
| } |
| |
| // Find the service manager |
| sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject()); |
| return sServiceManager; |
| } |
| |
| /** |
| * Returns a reference to a service with the given name. |
| * |
| * @param name the name of the service to get |
| * @return a reference to the service, or <code>null</code> if the service doesn't exist |
| */ |
| 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; |
| } |
| |
| /** |
| * Place a new @a service called @a name into the service |
| * manager. |
| * |
| * @param name the name of the new service |
| * @param service the service object |
| */ |
| public static void addService(String name, IBinder service) { |
| try { |
| getIServiceManager().addService(name, service, false); |
| } catch (RemoteException e) { |
| Log.e(TAG, "error in addService", e); |
| } |
| } |
| |
| /** |
| * Place a new @a service called @a name into the service |
| * manager. |
| * |
| * @param name the name of the new service |
| * @param service the service object |
| * @param allowIsolated set to true to allow isolated sandboxed processes |
| * to access this service |
| */ |
| public static void addService(String name, IBinder service, boolean allowIsolated) { |
| try { |
| getIServiceManager().addService(name, service, allowIsolated); |
| } catch (RemoteException e) { |
| Log.e(TAG, "error in addService", e); |
| } |
| } |
| |
| /** |
| * Retrieve an existing service called @a name from the |
| * service manager. Non-blocking. |
| */ |
| public static IBinder checkService(String name) { |
| try { |
| IBinder service = sCache.get(name); |
| if (service != null) { |
| return service; |
| } else { |
| return getIServiceManager().checkService(name); |
| } |
| } catch (RemoteException e) { |
| Log.e(TAG, "error in checkService", e); |
| return null; |
| } |
| } |
| |
| /** |
| * Return a list of all currently running services. |
| */ |
| public static String[] listServices() throws RemoteException { |
| try { |
| return getIServiceManager().listServices(); |
| } catch (RemoteException e) { |
| Log.e(TAG, "error in listServices", e); |
| return null; |
| } |
| } |
| |
| /** |
| * This is only intended to be called when the process is first being brought |
| * up and bound by the activity manager. There is only one thread in the process |
| * at that time, so no locking is done. |
| * |
| * @param cache the cache of service references |
| * @hide |
| */ |
| public static void initServiceCache(Map<String, IBinder> cache) { |
| if (sCache.size() != 0) { |
| throw new IllegalStateException("setServiceCache may only be called once"); |
| } |
| sCache.putAll(cache); |
| } |
| } |