Home | History | Annotate | Download | only in server
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server;
     18 
     19 import android.content.Context;
     20 import android.os.IBinder;
     21 import android.os.ServiceManager;
     22 
     23 /**
     24  * The base class for services running in the system process. Override and implement
     25  * the lifecycle event callback methods as needed.
     26  * <p>
     27  * The lifecycle of a SystemService:
     28  * </p><ul>
     29  * <li>The constructor is called and provided with the system {@link Context}
     30  * to initialize the system service.
     31  * <li>{@link #onStart()} is called to get the service running.  The service should
     32  * publish its binder interface at this point using
     33  * {@link #publishBinderService(String, IBinder)}.  It may also publish additional
     34  * local interfaces that other services within the system server may use to access
     35  * privileged internal functions.
     36  * <li>Then {@link #onBootPhase(int)} is called as many times as there are boot phases
     37  * until {@link #PHASE_BOOT_COMPLETE} is sent, which is the last boot phase. Each phase
     38  * is an opportunity to do special work, like acquiring optional service dependencies,
     39  * waiting to see if SafeMode is enabled, or registering with a service that gets
     40  * started after this one.
     41  * </ul><p>
     42  * NOTE: All lifecycle methods are called from the system server's main looper thread.
     43  * </p>
     44  *
     45  * {@hide}
     46  */
     47 public abstract class SystemService {
     48     /*
     49      * Boot Phases
     50      */
     51     public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // maybe should be a dependency?
     52 
     53     /**
     54      * After receiving this boot phase, services can obtain lock settings data.
     55      */
     56     public static final int PHASE_LOCK_SETTINGS_READY = 480;
     57 
     58     /**
     59      * After receiving this boot phase, services can safely call into core system services
     60      * such as the PowerManager or PackageManager.
     61      */
     62     public static final int PHASE_SYSTEM_SERVICES_READY = 500;
     63 
     64     /**
     65      * After receiving this boot phase, services can broadcast Intents.
     66      */
     67     public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
     68 
     69     /**
     70      * After receiving this boot phase, services can start/bind to third party apps.
     71      * Apps will be able to make Binder calls into services at this point.
     72      */
     73     public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
     74 
     75     /**
     76      * After receiving this boot phase, services can allow user interaction with the device.
     77      * This phase occurs when boot has completed and the home application has started.
     78      * System services may prefer to listen to this phase rather than registering a
     79      * broadcast receiver for ACTION_BOOT_COMPLETED to reduce overall latency.
     80      */
     81     public static final int PHASE_BOOT_COMPLETED = 1000;
     82 
     83     private final Context mContext;
     84 
     85     /**
     86      * Initializes the system service.
     87      * <p>
     88      * Subclasses must define a single argument constructor that accepts the context
     89      * and passes it to super.
     90      * </p>
     91      *
     92      * @param context The system server context.
     93      */
     94     public SystemService(Context context) {
     95         mContext = context;
     96     }
     97 
     98     /**
     99      * Gets the system context.
    100      */
    101     public final Context getContext() {
    102         return mContext;
    103     }
    104 
    105     /**
    106      * Returns true if the system is running in safe mode.
    107      * TODO: we should define in which phase this becomes valid
    108      */
    109     public final boolean isSafeMode() {
    110         return getManager().isSafeMode();
    111     }
    112 
    113     /**
    114      * Called when the dependencies listed in the @Service class-annotation are available
    115      * and after the chosen start phase.
    116      * When this method returns, the service should be published.
    117      */
    118     public abstract void onStart();
    119 
    120     /**
    121      * Called on each phase of the boot process. Phases before the service's start phase
    122      * (as defined in the @Service annotation) are never received.
    123      *
    124      * @param phase The current boot phase.
    125      */
    126     public void onBootPhase(int phase) {}
    127 
    128     /**
    129      * Called when a new user is starting, for system services to initialize any per-user
    130      * state they maintain for running users.
    131      * @param userHandle The identifier of the user.
    132      */
    133     public void onStartUser(int userHandle) {}
    134 
    135     /**
    136      * Called when switching to a different foreground user, for system services that have
    137      * special behavior for whichever user is currently in the foreground.  This is called
    138      * before any application processes are aware of the new user.
    139      * @param userHandle The identifier of the user.
    140      */
    141     public void onSwitchUser(int userHandle) {}
    142 
    143     /**
    144      * Called when an existing user is stopping, for system services to finalize any per-user
    145      * state they maintain for running users.  This is called prior to sending the SHUTDOWN
    146      * broadcast to the user; it is a good place to stop making use of any resources of that
    147      * user (such as binding to a service running in the user).
    148      * @param userHandle The identifier of the user.
    149      */
    150     public void onStopUser(int userHandle) {}
    151 
    152     /**
    153      * Called when an existing user is stopping, for system services to finalize any per-user
    154      * state they maintain for running users.  This is called after all application process
    155      * teardown of the user is complete.
    156      * @param userHandle The identifier of the user.
    157      */
    158     public void onCleanupUser(int userHandle) {}
    159 
    160     /**
    161      * Publish the service so it is accessible to other services and apps.
    162      */
    163     protected final void publishBinderService(String name, IBinder service) {
    164         publishBinderService(name, service, false);
    165     }
    166 
    167     /**
    168      * Publish the service so it is accessible to other services and apps.
    169      */
    170     protected final void publishBinderService(String name, IBinder service,
    171             boolean allowIsolated) {
    172         ServiceManager.addService(name, service, allowIsolated);
    173     }
    174 
    175     /**
    176      * Get a binder service by its name.
    177      */
    178     protected final IBinder getBinderService(String name) {
    179         return ServiceManager.getService(name);
    180     }
    181 
    182     /**
    183      * Publish the service so it is only accessible to the system process.
    184      */
    185     protected final <T> void publishLocalService(Class<T> type, T service) {
    186         LocalServices.addService(type, service);
    187     }
    188 
    189     /**
    190      * Get a local service by interface.
    191      */
    192     protected final <T> T getLocalService(Class<T> type) {
    193         return LocalServices.getService(type);
    194     }
    195 
    196     private SystemServiceManager getManager() {
    197         return LocalServices.getService(SystemServiceManager.class);
    198     }
    199 }
    200