Home | History | Annotate | Download | only in content
      1 /*
      2  * Copyright (C) 2006 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 android.content;
     18 
     19 import android.annotation.AttrRes;
     20 import android.annotation.CheckResult;
     21 import android.annotation.ColorInt;
     22 import android.annotation.ColorRes;
     23 import android.annotation.DrawableRes;
     24 import android.annotation.IntDef;
     25 import android.annotation.NonNull;
     26 import android.annotation.Nullable;
     27 import android.annotation.RequiresPermission;
     28 import android.annotation.StringDef;
     29 import android.annotation.StringRes;
     30 import android.annotation.StyleRes;
     31 import android.annotation.StyleableRes;
     32 import android.annotation.SystemApi;
     33 import android.annotation.TestApi;
     34 import android.annotation.UserIdInt;
     35 import android.app.IApplicationThread;
     36 import android.app.IServiceConnection;
     37 import android.app.Notification;
     38 import android.app.VrManager;
     39 import android.content.pm.ApplicationInfo;
     40 import android.content.pm.PackageManager;
     41 import android.content.res.AssetManager;
     42 import android.content.res.ColorStateList;
     43 import android.content.res.Configuration;
     44 import android.content.res.Resources;
     45 import android.content.res.TypedArray;
     46 import android.database.DatabaseErrorHandler;
     47 import android.database.sqlite.SQLiteDatabase;
     48 import android.database.sqlite.SQLiteDatabase.CursorFactory;
     49 import android.graphics.Bitmap;
     50 import android.graphics.drawable.Drawable;
     51 import android.net.Uri;
     52 import android.os.Bundle;
     53 import android.os.Environment;
     54 import android.os.Handler;
     55 import android.os.IBinder;
     56 import android.os.Looper;
     57 import android.os.StatFs;
     58 import android.os.UserHandle;
     59 import android.os.UserManager;
     60 import android.os.storage.StorageManager;
     61 import android.provider.MediaStore;
     62 import android.util.AttributeSet;
     63 import android.view.Display;
     64 import android.view.DisplayAdjustments;
     65 import android.view.View;
     66 import android.view.ViewDebug;
     67 import android.view.WindowManager;
     68 import android.view.textclassifier.TextClassificationManager;
     69 
     70 import java.io.File;
     71 import java.io.FileInputStream;
     72 import java.io.FileNotFoundException;
     73 import java.io.FileOutputStream;
     74 import java.io.IOException;
     75 import java.io.InputStream;
     76 import java.lang.annotation.Retention;
     77 import java.lang.annotation.RetentionPolicy;
     78 
     79 /**
     80  * Interface to global information about an application environment.  This is
     81  * an abstract class whose implementation is provided by
     82  * the Android system.  It
     83  * allows access to application-specific resources and classes, as well as
     84  * up-calls for application-level operations such as launching activities,
     85  * broadcasting and receiving intents, etc.
     86  */
     87 public abstract class Context {
     88     /** @hide */
     89     @IntDef(flag = true, prefix = { "MODE_" }, value = {
     90             MODE_PRIVATE,
     91             MODE_WORLD_READABLE,
     92             MODE_WORLD_WRITEABLE,
     93             MODE_APPEND,
     94     })
     95     @Retention(RetentionPolicy.SOURCE)
     96     public @interface FileMode {}
     97 
     98     /** @hide */
     99     @IntDef(flag = true, prefix = { "MODE_" }, value = {
    100             MODE_PRIVATE,
    101             MODE_WORLD_READABLE,
    102             MODE_WORLD_WRITEABLE,
    103             MODE_MULTI_PROCESS,
    104     })
    105     @Retention(RetentionPolicy.SOURCE)
    106     public @interface PreferencesMode {}
    107 
    108     /** @hide */
    109     @IntDef(flag = true, prefix = { "MODE_" }, value = {
    110             MODE_PRIVATE,
    111             MODE_WORLD_READABLE,
    112             MODE_WORLD_WRITEABLE,
    113             MODE_ENABLE_WRITE_AHEAD_LOGGING,
    114             MODE_NO_LOCALIZED_COLLATORS,
    115     })
    116     @Retention(RetentionPolicy.SOURCE)
    117     public @interface DatabaseMode {}
    118 
    119     /**
    120      * File creation mode: the default mode, where the created file can only
    121      * be accessed by the calling application (or all applications sharing the
    122      * same user ID).
    123      */
    124     public static final int MODE_PRIVATE = 0x0000;
    125 
    126     /**
    127      * File creation mode: allow all other applications to have read access to
    128      * the created file.
    129      * <p>
    130      * As of {@link android.os.Build.VERSION_CODES#N} attempting to use this
    131      * mode will throw a {@link SecurityException}.
    132      *
    133      * @deprecated Creating world-readable files is very dangerous, and likely
    134      *             to cause security holes in applications. It is strongly
    135      *             discouraged; instead, applications should use more formal
    136      *             mechanism for interactions such as {@link ContentProvider},
    137      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
    138      *             There are no guarantees that this access mode will remain on
    139      *             a file, such as when it goes through a backup and restore.
    140      * @see android.support.v4.content.FileProvider
    141      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
    142      */
    143     @Deprecated
    144     public static final int MODE_WORLD_READABLE = 0x0001;
    145 
    146     /**
    147      * File creation mode: allow all other applications to have write access to
    148      * the created file.
    149      * <p>
    150      * As of {@link android.os.Build.VERSION_CODES#N} attempting to use this
    151      * mode will throw a {@link SecurityException}.
    152      *
    153      * @deprecated Creating world-writable files is very dangerous, and likely
    154      *             to cause security holes in applications. It is strongly
    155      *             discouraged; instead, applications should use more formal
    156      *             mechanism for interactions such as {@link ContentProvider},
    157      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
    158      *             There are no guarantees that this access mode will remain on
    159      *             a file, such as when it goes through a backup and restore.
    160      * @see android.support.v4.content.FileProvider
    161      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
    162      */
    163     @Deprecated
    164     public static final int MODE_WORLD_WRITEABLE = 0x0002;
    165 
    166     /**
    167      * File creation mode: for use with {@link #openFileOutput}, if the file
    168      * already exists then write data to the end of the existing file
    169      * instead of erasing it.
    170      * @see #openFileOutput
    171      */
    172     public static final int MODE_APPEND = 0x8000;
    173 
    174     /**
    175      * SharedPreference loading flag: when set, the file on disk will
    176      * be checked for modification even if the shared preferences
    177      * instance is already loaded in this process.  This behavior is
    178      * sometimes desired in cases where the application has multiple
    179      * processes, all writing to the same SharedPreferences file.
    180      * Generally there are better forms of communication between
    181      * processes, though.
    182      *
    183      * <p>This was the legacy (but undocumented) behavior in and
    184      * before Gingerbread (Android 2.3) and this flag is implied when
    185      * targetting such releases.  For applications targetting SDK
    186      * versions <em>greater than</em> Android 2.3, this flag must be
    187      * explicitly set if desired.
    188      *
    189      * @see #getSharedPreferences
    190      *
    191      * @deprecated MODE_MULTI_PROCESS does not work reliably in
    192      * some versions of Android, and furthermore does not provide any
    193      * mechanism for reconciling concurrent modifications across
    194      * processes.  Applications should not attempt to use it.  Instead,
    195      * they should use an explicit cross-process data management
    196      * approach such as {@link android.content.ContentProvider ContentProvider}.
    197      */
    198     @Deprecated
    199     public static final int MODE_MULTI_PROCESS = 0x0004;
    200 
    201     /**
    202      * Database open flag: when set, the database is opened with write-ahead
    203      * logging enabled by default.
    204      *
    205      * @see #openOrCreateDatabase(String, int, CursorFactory)
    206      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
    207      * @see SQLiteDatabase#enableWriteAheadLogging
    208      */
    209     public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008;
    210 
    211     /**
    212      * Database open flag: when set, the database is opened without support for
    213      * localized collators.
    214      *
    215      * @see #openOrCreateDatabase(String, int, CursorFactory)
    216      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
    217      * @see SQLiteDatabase#NO_LOCALIZED_COLLATORS
    218      */
    219     public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010;
    220 
    221     /** @hide */
    222     @IntDef(flag = true,
    223             value = {
    224                 BIND_AUTO_CREATE,
    225                 BIND_DEBUG_UNBIND,
    226                 BIND_NOT_FOREGROUND,
    227                 BIND_ABOVE_CLIENT,
    228                 BIND_ALLOW_OOM_MANAGEMENT,
    229                 BIND_WAIVE_PRIORITY,
    230                 BIND_IMPORTANT,
    231                 BIND_ADJUST_WITH_ACTIVITY
    232             })
    233     @Retention(RetentionPolicy.SOURCE)
    234     public @interface BindServiceFlags {}
    235 
    236     /**
    237      * Flag for {@link #bindService}: automatically create the service as long
    238      * as the binding exists.  Note that while this will create the service,
    239      * its {@link android.app.Service#onStartCommand}
    240      * method will still only be called due to an
    241      * explicit call to {@link #startService}.  Even without that, though,
    242      * this still provides you with access to the service object while the
    243      * service is created.
    244      *
    245      * <p>Note that prior to {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH},
    246      * not supplying this flag would also impact how important the system
    247      * consider's the target service's process to be.  When set, the only way
    248      * for it to be raised was by binding from a service in which case it will
    249      * only be important when that activity is in the foreground.  Now to
    250      * achieve this behavior you must explicitly supply the new flag
    251      * {@link #BIND_ADJUST_WITH_ACTIVITY}.  For compatibility, old applications
    252      * that don't specify {@link #BIND_AUTO_CREATE} will automatically have
    253      * the flags {@link #BIND_WAIVE_PRIORITY} and
    254      * {@link #BIND_ADJUST_WITH_ACTIVITY} set for them in order to achieve
    255      * the same result.
    256      */
    257     public static final int BIND_AUTO_CREATE = 0x0001;
    258 
    259     /**
    260      * Flag for {@link #bindService}: include debugging help for mismatched
    261      * calls to unbind.  When this flag is set, the callstack of the following
    262      * {@link #unbindService} call is retained, to be printed if a later
    263      * incorrect unbind call is made.  Note that doing this requires retaining
    264      * information about the binding that was made for the lifetime of the app,
    265      * resulting in a leak -- this should only be used for debugging.
    266      */
    267     public static final int BIND_DEBUG_UNBIND = 0x0002;
    268 
    269     /**
    270      * Flag for {@link #bindService}: don't allow this binding to raise
    271      * the target service's process to the foreground scheduling priority.
    272      * It will still be raised to at least the same memory priority
    273      * as the client (so that its process will not be killable in any
    274      * situation where the client is not killable), but for CPU scheduling
    275      * purposes it may be left in the background.  This only has an impact
    276      * in the situation where the binding client is a foreground process
    277      * and the target service is in a background process.
    278      */
    279     public static final int BIND_NOT_FOREGROUND = 0x0004;
    280 
    281     /**
    282      * Flag for {@link #bindService}: indicates that the client application
    283      * binding to this service considers the service to be more important than
    284      * the app itself.  When set, the platform will try to have the out of
    285      * memory killer kill the app before it kills the service it is bound to, though
    286      * this is not guaranteed to be the case.
    287      */
    288     public static final int BIND_ABOVE_CLIENT = 0x0008;
    289 
    290     /**
    291      * Flag for {@link #bindService}: allow the process hosting the bound
    292      * service to go through its normal memory management.  It will be
    293      * treated more like a running service, allowing the system to
    294      * (temporarily) expunge the process if low on memory or for some other
    295      * whim it may have, and being more aggressive about making it a candidate
    296      * to be killed (and restarted) if running for a long time.
    297      */
    298     public static final int BIND_ALLOW_OOM_MANAGEMENT = 0x0010;
    299 
    300     /**
    301      * Flag for {@link #bindService}: don't impact the scheduling or
    302      * memory management priority of the target service's hosting process.
    303      * Allows the service's process to be managed on the background LRU list
    304      * just like a regular application process in the background.
    305      */
    306     public static final int BIND_WAIVE_PRIORITY = 0x0020;
    307 
    308     /**
    309      * Flag for {@link #bindService}: this service is very important to
    310      * the client, so should be brought to the foreground process level
    311      * when the client is.  Normally a process can only be raised to the
    312      * visibility level by a client, even if that client is in the foreground.
    313      */
    314     public static final int BIND_IMPORTANT = 0x0040;
    315 
    316     /**
    317      * Flag for {@link #bindService}: If binding from an activity, allow the
    318      * target service's process importance to be raised based on whether the
    319      * activity is visible to the user, regardless whether another flag is
    320      * used to reduce the amount that the client process's overall importance
    321      * is used to impact it.
    322      */
    323     public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;
    324 
    325     /**
    326      * @hide Flag for {@link #bindService}: like {@link #BIND_NOT_FOREGROUND}, but puts it
    327      * up in to the important background state (instead of transient).
    328      */
    329     public static final int BIND_IMPORTANT_BACKGROUND = 0x00800000;
    330 
    331     /**
    332      * @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists
    333      * such as temporary allowing a {@code PendingIntent} to bypass Power Save mode.
    334      */
    335     public static final int BIND_ALLOW_WHITELIST_MANAGEMENT = 0x01000000;
    336 
    337     /**
    338      * @hide Flag for {@link #bindService}: Like {@link #BIND_FOREGROUND_SERVICE},
    339      * but only applies while the device is awake.
    340      */
    341     public static final int BIND_FOREGROUND_SERVICE_WHILE_AWAKE = 0x02000000;
    342 
    343     /**
    344      * @hide Flag for {@link #bindService}: For only the case where the binding
    345      * is coming from the system, set the process state to FOREGROUND_SERVICE
    346      * instead of the normal maximum of IMPORTANT_FOREGROUND.  That is, this is
    347      * saying that the process shouldn't participate in the normal power reduction
    348      * modes (removing network access etc).
    349      */
    350     public static final int BIND_FOREGROUND_SERVICE = 0x04000000;
    351 
    352     /**
    353      * @hide Flag for {@link #bindService}: Treat the binding as hosting
    354      * an activity, an unbinding as the activity going in the background.
    355      * That is, when unbinding, the process when empty will go on the activity
    356      * LRU list instead of the regular one, keeping it around more aggressively
    357      * than it otherwise would be.  This is intended for use with IMEs to try
    358      * to keep IME processes around for faster keyboard switching.
    359      */
    360     public static final int BIND_TREAT_LIKE_ACTIVITY = 0x08000000;
    361 
    362     /**
    363      * @hide An idea that is not yet implemented.
    364      * Flag for {@link #bindService}: If binding from an activity, consider
    365      * this service to be visible like the binding activity is.  That is,
    366      * it will be treated as something more important to keep around than
    367      * invisible background activities.  This will impact the number of
    368      * recent activities the user can switch between without having them
    369      * restart.  There is no guarantee this will be respected, as the system
    370      * tries to balance such requests from one app vs. the importantance of
    371      * keeping other apps around.
    372      */
    373     public static final int BIND_VISIBLE = 0x10000000;
    374 
    375     /**
    376      * @hide
    377      * Flag for {@link #bindService}: Consider this binding to be causing the target
    378      * process to be showing UI, so it will be do a UI_HIDDEN memory trim when it goes
    379      * away.
    380      */
    381     public static final int BIND_SHOWING_UI = 0x20000000;
    382 
    383     /**
    384      * Flag for {@link #bindService}: Don't consider the bound service to be
    385      * visible, even if the caller is visible.
    386      * @hide
    387      */
    388     public static final int BIND_NOT_VISIBLE = 0x40000000;
    389 
    390     /**
    391      * Flag for {@link #bindService}: The service being bound is an
    392      * {@link android.R.attr#isolatedProcess isolated},
    393      * {@link android.R.attr#externalService external} service.  This binds the service into the
    394      * calling application's package, rather than the package in which the service is declared.
    395      * <p>
    396      * When using this flag, the code for the service being bound will execute under the calling
    397      * application's package name and user ID.  Because the service must be an isolated process,
    398      * it will not have direct access to the application's data, though.
    399      *
    400      * The purpose of this flag is to allow applications to provide services that are attributed
    401      * to the app using the service, rather than the application providing the service.
    402      * </p>
    403      */
    404     public static final int BIND_EXTERNAL_SERVICE = 0x80000000;
    405 
    406     /** @hide */
    407     @IntDef(flag = true,
    408             value = {
    409                 RECEIVER_VISIBLE_TO_INSTANT_APPS
    410             })
    411     @Retention(RetentionPolicy.SOURCE)
    412     public @interface RegisterReceiverFlags {}
    413 
    414     /**
    415      * Flag for {@link #registerReceiver}: The receiver can receive broadcasts from Instant Apps.
    416      */
    417     public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 0x1;
    418 
    419     /**
    420      * Returns an AssetManager instance for the application's package.
    421      * <p>
    422      * <strong>Note:</strong> Implementations of this method should return
    423      * an AssetManager instance that is consistent with the Resources instance
    424      * returned by {@link #getResources()}. For example, they should share the
    425      * same {@link Configuration} object.
    426      *
    427      * @return an AssetManager instance for the application's package
    428      * @see #getResources()
    429      */
    430     public abstract AssetManager getAssets();
    431 
    432     /**
    433      * Returns a Resources instance for the application's package.
    434      * <p>
    435      * <strong>Note:</strong> Implementations of this method should return
    436      * a Resources instance that is consistent with the AssetManager instance
    437      * returned by {@link #getAssets()}. For example, they should share the
    438      * same {@link Configuration} object.
    439      *
    440      * @return a Resources instance for the application's package
    441      * @see #getAssets()
    442      */
    443     public abstract Resources getResources();
    444 
    445     /** Return PackageManager instance to find global package information. */
    446     public abstract PackageManager getPackageManager();
    447 
    448     /** Return a ContentResolver instance for your application's package. */
    449     public abstract ContentResolver getContentResolver();
    450 
    451     /**
    452      * Return the Looper for the main thread of the current process.  This is
    453      * the thread used to dispatch calls to application components (activities,
    454      * services, etc).
    455      * <p>
    456      * By definition, this method returns the same result as would be obtained
    457      * by calling {@link Looper#getMainLooper() Looper.getMainLooper()}.
    458      * </p>
    459      *
    460      * @return The main looper.
    461      */
    462     public abstract Looper getMainLooper();
    463 
    464     /**
    465      * Return the context of the single, global Application object of the
    466      * current process.  This generally should only be used if you need a
    467      * Context whose lifecycle is separate from the current context, that is
    468      * tied to the lifetime of the process rather than the current component.
    469      *
    470      * <p>Consider for example how this interacts with
    471      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)}:
    472      * <ul>
    473      * <li> <p>If used from an Activity context, the receiver is being registered
    474      * within that activity.  This means that you are expected to unregister
    475      * before the activity is done being destroyed; in fact if you do not do
    476      * so, the framework will clean up your leaked registration as it removes
    477      * the activity and log an error.  Thus, if you use the Activity context
    478      * to register a receiver that is static (global to the process, not
    479      * associated with an Activity instance) then that registration will be
    480      * removed on you at whatever point the activity you used is destroyed.
    481      * <li> <p>If used from the Context returned here, the receiver is being
    482      * registered with the global state associated with your application.  Thus
    483      * it will never be unregistered for you.  This is necessary if the receiver
    484      * is associated with static data, not a particular component.  However
    485      * using the ApplicationContext elsewhere can easily lead to serious leaks
    486      * if you forget to unregister, unbind, etc.
    487      * </ul>
    488      */
    489     public abstract Context getApplicationContext();
    490 
    491     /** Non-activity related autofill ids are unique in the app */
    492     private static int sLastAutofillId = View.NO_ID;
    493 
    494     /**
    495      * Gets the next autofill ID.
    496      *
    497      * <p>All IDs will be smaller or the same as {@link View#LAST_APP_AUTOFILL_ID}. All IDs
    498      * returned will be unique.
    499      *
    500      * @return A ID that is unique in the process
    501      *
    502      * {@hide}
    503      */
    504     public int getNextAutofillId() {
    505         if (sLastAutofillId == View.LAST_APP_AUTOFILL_ID - 1) {
    506             sLastAutofillId = View.NO_ID;
    507         }
    508 
    509         sLastAutofillId++;
    510 
    511         return sLastAutofillId;
    512     }
    513 
    514     /**
    515      * Add a new {@link ComponentCallbacks} to the base application of the
    516      * Context, which will be called at the same times as the ComponentCallbacks
    517      * methods of activities and other components are called.  Note that you
    518      * <em>must</em> be sure to use {@link #unregisterComponentCallbacks} when
    519      * appropriate in the future; this will not be removed for you.
    520      *
    521      * @param callback The interface to call.  This can be either a
    522      * {@link ComponentCallbacks} or {@link ComponentCallbacks2} interface.
    523      */
    524     public void registerComponentCallbacks(ComponentCallbacks callback) {
    525         getApplicationContext().registerComponentCallbacks(callback);
    526     }
    527 
    528     /**
    529      * Remove a {@link ComponentCallbacks} object that was previously registered
    530      * with {@link #registerComponentCallbacks(ComponentCallbacks)}.
    531      */
    532     public void unregisterComponentCallbacks(ComponentCallbacks callback) {
    533         getApplicationContext().unregisterComponentCallbacks(callback);
    534     }
    535 
    536     /**
    537      * Return a localized, styled CharSequence from the application's package's
    538      * default string table.
    539      *
    540      * @param resId Resource id for the CharSequence text
    541      */
    542     public final CharSequence getText(@StringRes int resId) {
    543         return getResources().getText(resId);
    544     }
    545 
    546     /**
    547      * Returns a localized string from the application's package's
    548      * default string table.
    549      *
    550      * @param resId Resource id for the string
    551      * @return The string data associated with the resource, stripped of styled
    552      *         text information.
    553      */
    554     @NonNull
    555     public final String getString(@StringRes int resId) {
    556         return getResources().getString(resId);
    557     }
    558 
    559     /**
    560      * Returns a localized formatted string from the application's package's
    561      * default string table, substituting the format arguments as defined in
    562      * {@link java.util.Formatter} and {@link java.lang.String#format}.
    563      *
    564      * @param resId Resource id for the format string
    565      * @param formatArgs The format arguments that will be used for
    566      *                   substitution.
    567      * @return The string data associated with the resource, formatted and
    568      *         stripped of styled text information.
    569      */
    570     @NonNull
    571     public final String getString(@StringRes int resId, Object... formatArgs) {
    572         return getResources().getString(resId, formatArgs);
    573     }
    574 
    575     /**
    576      * Returns a color associated with a particular resource ID and styled for
    577      * the current theme.
    578      *
    579      * @param id The desired resource identifier, as generated by the aapt
    580      *           tool. This integer encodes the package, type, and resource
    581      *           entry. The value 0 is an invalid identifier.
    582      * @return A single color value in the form 0xAARRGGBB.
    583      * @throws android.content.res.Resources.NotFoundException if the given ID
    584      *         does not exist.
    585      */
    586     @ColorInt
    587     public final int getColor(@ColorRes int id) {
    588         return getResources().getColor(id, getTheme());
    589     }
    590 
    591     /**
    592      * Returns a drawable object associated with a particular resource ID and
    593      * styled for the current theme.
    594      *
    595      * @param id The desired resource identifier, as generated by the aapt
    596      *           tool. This integer encodes the package, type, and resource
    597      *           entry. The value 0 is an invalid identifier.
    598      * @return An object that can be used to draw this resource, or
    599      *         {@code null} if the resource could not be resolved.
    600      * @throws android.content.res.Resources.NotFoundException if the given ID
    601      *         does not exist.
    602      */
    603     @Nullable
    604     public final Drawable getDrawable(@DrawableRes int id) {
    605         return getResources().getDrawable(id, getTheme());
    606     }
    607 
    608     /**
    609      * Returns a color state list associated with a particular resource ID and
    610      * styled for the current theme.
    611      *
    612      * @param id The desired resource identifier, as generated by the aapt
    613      *           tool. This integer encodes the package, type, and resource
    614      *           entry. The value 0 is an invalid identifier.
    615      * @return A color state list, or {@code null} if the resource could not be
    616      *         resolved.
    617      * @throws android.content.res.Resources.NotFoundException if the given ID
    618      *         does not exist.
    619      */
    620     @Nullable
    621     public final ColorStateList getColorStateList(@ColorRes int id) {
    622         return getResources().getColorStateList(id, getTheme());
    623     }
    624 
    625      /**
    626      * Set the base theme for this context.  Note that this should be called
    627      * before any views are instantiated in the Context (for example before
    628      * calling {@link android.app.Activity#setContentView} or
    629      * {@link android.view.LayoutInflater#inflate}).
    630      *
    631      * @param resid The style resource describing the theme.
    632      */
    633     public abstract void setTheme(@StyleRes int resid);
    634 
    635     /** @hide Needed for some internal implementation...  not public because
    636      * you can't assume this actually means anything. */
    637     public int getThemeResId() {
    638         return 0;
    639     }
    640 
    641     /**
    642      * Return the Theme object associated with this Context.
    643      */
    644     @ViewDebug.ExportedProperty(deepExport = true)
    645     public abstract Resources.Theme getTheme();
    646 
    647     /**
    648      * Retrieve styled attribute information in this Context's theme.  See
    649      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int[])}
    650      * for more information.
    651      *
    652      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int[])
    653      */
    654     public final TypedArray obtainStyledAttributes(@StyleableRes int[] attrs) {
    655         return getTheme().obtainStyledAttributes(attrs);
    656     }
    657 
    658     /**
    659      * Retrieve styled attribute information in this Context's theme.  See
    660      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])}
    661      * for more information.
    662      *
    663      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])
    664      */
    665     public final TypedArray obtainStyledAttributes(
    666             @StyleRes int resid, @StyleableRes int[] attrs) throws Resources.NotFoundException {
    667         return getTheme().obtainStyledAttributes(resid, attrs);
    668     }
    669 
    670     /**
    671      * Retrieve styled attribute information in this Context's theme.  See
    672      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
    673      * for more information.
    674      *
    675      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
    676      */
    677     public final TypedArray obtainStyledAttributes(
    678             AttributeSet set, @StyleableRes int[] attrs) {
    679         return getTheme().obtainStyledAttributes(set, attrs, 0, 0);
    680     }
    681 
    682     /**
    683      * Retrieve styled attribute information in this Context's theme.  See
    684      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
    685      * for more information.
    686      *
    687      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
    688      */
    689     public final TypedArray obtainStyledAttributes(
    690             AttributeSet set, @StyleableRes int[] attrs, @AttrRes int defStyleAttr,
    691             @StyleRes int defStyleRes) {
    692         return getTheme().obtainStyledAttributes(
    693             set, attrs, defStyleAttr, defStyleRes);
    694     }
    695 
    696     /**
    697      * Return a class loader you can use to retrieve classes in this package.
    698      */
    699     public abstract ClassLoader getClassLoader();
    700 
    701     /** Return the name of this application's package. */
    702     public abstract String getPackageName();
    703 
    704     /** @hide Return the name of the base context this context is derived from. */
    705     public abstract String getBasePackageName();
    706 
    707     /** @hide Return the package name that should be used for app ops calls from
    708      * this context.  This is the same as {@link #getBasePackageName()} except in
    709      * cases where system components are loaded into other app processes, in which
    710      * case this will be the name of the primary package in that process (so that app
    711      * ops uid verification will work with the name). */
    712     public abstract String getOpPackageName();
    713 
    714     /** Return the full application info for this context's package. */
    715     public abstract ApplicationInfo getApplicationInfo();
    716 
    717     /**
    718      * Return the full path to this context's primary Android package.
    719      * The Android package is a ZIP file which contains the application's
    720      * primary resources.
    721      *
    722      * <p>Note: this is not generally useful for applications, since they should
    723      * not be directly accessing the file system.
    724      *
    725      * @return String Path to the resources.
    726      */
    727     public abstract String getPackageResourcePath();
    728 
    729     /**
    730      * Return the full path to this context's primary Android package.
    731      * The Android package is a ZIP file which contains application's
    732      * primary code and assets.
    733      *
    734      * <p>Note: this is not generally useful for applications, since they should
    735      * not be directly accessing the file system.
    736      *
    737      * @return String Path to the code and assets.
    738      */
    739     public abstract String getPackageCodePath();
    740 
    741     /**
    742      * @hide
    743      * @deprecated use {@link #getSharedPreferencesPath(String)}
    744      */
    745     @Deprecated
    746     public File getSharedPrefsFile(String name) {
    747         return getSharedPreferencesPath(name);
    748     }
    749 
    750     /**
    751      * Retrieve and hold the contents of the preferences file 'name', returning
    752      * a SharedPreferences through which you can retrieve and modify its
    753      * values.  Only one instance of the SharedPreferences object is returned
    754      * to any callers for the same name, meaning they will see each other's
    755      * edits as soon as they are made.
    756      *
    757      * @param name Desired preferences file. If a preferences file by this name
    758      * does not exist, it will be created when you retrieve an
    759      * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
    760      * @param mode Operating mode.
    761      *
    762      * @return The single {@link SharedPreferences} instance that can be used
    763      *         to retrieve and modify the preference values.
    764      *
    765      * @see #MODE_PRIVATE
    766      */
    767     public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
    768 
    769     /**
    770      * Retrieve and hold the contents of the preferences file, returning
    771      * a SharedPreferences through which you can retrieve and modify its
    772      * values.  Only one instance of the SharedPreferences object is returned
    773      * to any callers for the same name, meaning they will see each other's
    774      * edits as soon as they are made.
    775      *
    776      * @param file Desired preferences file. If a preferences file by this name
    777      * does not exist, it will be created when you retrieve an
    778      * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
    779      * @param mode Operating mode.
    780      *
    781      * @return The single {@link SharedPreferences} instance that can be used
    782      *         to retrieve and modify the preference values.
    783      *
    784      * @see #getSharedPreferencesPath(String)
    785      * @see #MODE_PRIVATE
    786      * @removed
    787      */
    788     public abstract SharedPreferences getSharedPreferences(File file, @PreferencesMode int mode);
    789 
    790     /**
    791      * Move an existing shared preferences file from the given source storage
    792      * context to this context. This is typically used to migrate data between
    793      * storage locations after an upgrade, such as moving to device protected
    794      * storage.
    795      *
    796      * @param sourceContext The source context which contains the existing
    797      *            shared preferences to move.
    798      * @param name The name of the shared preferences file.
    799      * @return {@code true} if the move was successful or if the shared
    800      *         preferences didn't exist in the source context, otherwise
    801      *         {@code false}.
    802      * @see #createDeviceProtectedStorageContext()
    803      */
    804     public abstract boolean moveSharedPreferencesFrom(Context sourceContext, String name);
    805 
    806     /**
    807      * Delete an existing shared preferences file.
    808      *
    809      * @param name The name (unique in the application package) of the shared
    810      *            preferences file.
    811      * @return {@code true} if the shared preferences file was successfully
    812      *         deleted; else {@code false}.
    813      * @see #getSharedPreferences(String, int)
    814      */
    815     public abstract boolean deleteSharedPreferences(String name);
    816 
    817     /**
    818      * Open a private file associated with this Context's application package
    819      * for reading.
    820      *
    821      * @param name The name of the file to open; can not contain path
    822      *             separators.
    823      *
    824      * @return The resulting {@link FileInputStream}.
    825      *
    826      * @see #openFileOutput
    827      * @see #fileList
    828      * @see #deleteFile
    829      * @see java.io.FileInputStream#FileInputStream(String)
    830      */
    831     public abstract FileInputStream openFileInput(String name)
    832         throws FileNotFoundException;
    833 
    834     /**
    835      * Open a private file associated with this Context's application package
    836      * for writing. Creates the file if it doesn't already exist.
    837      * <p>
    838      * No additional permissions are required for the calling app to read or
    839      * write the returned file.
    840      *
    841      * @param name The name of the file to open; can not contain path
    842      *            separators.
    843      * @param mode Operating mode.
    844      * @return The resulting {@link FileOutputStream}.
    845      * @see #MODE_APPEND
    846      * @see #MODE_PRIVATE
    847      * @see #openFileInput
    848      * @see #fileList
    849      * @see #deleteFile
    850      * @see java.io.FileOutputStream#FileOutputStream(String)
    851      */
    852     public abstract FileOutputStream openFileOutput(String name, @FileMode int mode)
    853         throws FileNotFoundException;
    854 
    855     /**
    856      * Delete the given private file associated with this Context's
    857      * application package.
    858      *
    859      * @param name The name of the file to delete; can not contain path
    860      *             separators.
    861      *
    862      * @return {@code true} if the file was successfully deleted; else
    863      *         {@code false}.
    864      *
    865      * @see #openFileInput
    866      * @see #openFileOutput
    867      * @see #fileList
    868      * @see java.io.File#delete()
    869      */
    870     public abstract boolean deleteFile(String name);
    871 
    872     /**
    873      * Returns the absolute path on the filesystem where a file created with
    874      * {@link #openFileOutput} is stored.
    875      * <p>
    876      * The returned path may change over time if the calling app is moved to an
    877      * adopted storage device, so only relative paths should be persisted.
    878      *
    879      * @param name The name of the file for which you would like to get
    880      *          its path.
    881      *
    882      * @return An absolute path to the given file.
    883      *
    884      * @see #openFileOutput
    885      * @see #getFilesDir
    886      * @see #getDir
    887      */
    888     public abstract File getFileStreamPath(String name);
    889 
    890     /**
    891      * Returns the absolute path on the filesystem where a file created with
    892      * {@link #getSharedPreferences(String, int)} is stored.
    893      * <p>
    894      * The returned path may change over time if the calling app is moved to an
    895      * adopted storage device, so only relative paths should be persisted.
    896      *
    897      * @param name The name of the shared preferences for which you would like
    898      *            to get a path.
    899      * @return An absolute path to the given file.
    900      * @see #getSharedPreferences(String, int)
    901      * @removed
    902      */
    903     public abstract File getSharedPreferencesPath(String name);
    904 
    905     /**
    906      * Returns the absolute path to the directory on the filesystem where all
    907      * private files belonging to this app are stored. Apps should not use this
    908      * path directly; they should instead use {@link #getFilesDir()},
    909      * {@link #getCacheDir()}, {@link #getDir(String, int)}, or other storage
    910      * APIs on this class.
    911      * <p>
    912      * The returned path may change over time if the calling app is moved to an
    913      * adopted storage device, so only relative paths should be persisted.
    914      * <p>
    915      * No additional permissions are required for the calling app to read or
    916      * write files under the returned path.
    917      *
    918      * @see ApplicationInfo#dataDir
    919      */
    920     public abstract File getDataDir();
    921 
    922     /**
    923      * Returns the absolute path to the directory on the filesystem where files
    924      * created with {@link #openFileOutput} are stored.
    925      * <p>
    926      * The returned path may change over time if the calling app is moved to an
    927      * adopted storage device, so only relative paths should be persisted.
    928      * <p>
    929      * No additional permissions are required for the calling app to read or
    930      * write files under the returned path.
    931      *
    932      * @return The path of the directory holding application files.
    933      * @see #openFileOutput
    934      * @see #getFileStreamPath
    935      * @see #getDir
    936      */
    937     public abstract File getFilesDir();
    938 
    939     /**
    940      * Returns the absolute path to the directory on the filesystem similar to
    941      * {@link #getFilesDir()}. The difference is that files placed under this
    942      * directory will be excluded from automatic backup to remote storage. See
    943      * {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
    944      * of the automatic backup mechanism in Android.
    945      * <p>
    946      * The returned path may change over time if the calling app is moved to an
    947      * adopted storage device, so only relative paths should be persisted.
    948      * <p>
    949      * No additional permissions are required for the calling app to read or
    950      * write files under the returned path.
    951      *
    952      * @return The path of the directory holding application files that will not
    953      *         be automatically backed up to remote storage.
    954      * @see #openFileOutput
    955      * @see #getFileStreamPath
    956      * @see #getDir
    957      * @see android.app.backup.BackupAgent
    958      */
    959     public abstract File getNoBackupFilesDir();
    960 
    961     /**
    962      * Returns the absolute path to the directory on the primary shared/external
    963      * storage device where the application can place persistent files it owns.
    964      * These files are internal to the applications, and not typically visible
    965      * to the user as media.
    966      * <p>
    967      * This is like {@link #getFilesDir()} in that these files will be deleted
    968      * when the application is uninstalled, however there are some important
    969      * differences:
    970      * <ul>
    971      * <li>Shared storage may not always be available, since removable media can
    972      * be ejected by the user. Media state can be checked using
    973      * {@link Environment#getExternalStorageState(File)}.
    974      * <li>There is no security enforced with these files. For example, any
    975      * application holding
    976      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
    977      * these files.
    978      * </ul>
    979      * <p>
    980      * If a shared storage device is emulated (as determined by
    981      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
    982      * backed by a private user data partition, which means there is little
    983      * benefit to storing data here instead of the private directories returned
    984      * by {@link #getFilesDir()}, etc.
    985      * <p>
    986      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
    987      * are required to read or write to the returned path; it's always
    988      * accessible to the calling app. This only applies to paths generated for
    989      * package name of the calling application. To access paths belonging to
    990      * other packages,
    991      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
    992      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
    993      * <p>
    994      * On devices with multiple users (as described by {@link UserManager}),
    995      * each user has their own isolated shared storage. Applications only have
    996      * access to the shared storage for the user they're running as.
    997      * <p>
    998      * The returned path may change over time if different shared storage media
    999      * is inserted, so only relative paths should be persisted.
   1000      * <p>
   1001      * Here is an example of typical code to manipulate a file in an
   1002      * application's shared storage:
   1003      * </p>
   1004      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
   1005      * private_file}
   1006      * <p>
   1007      * If you supply a non-null <var>type</var> to this function, the returned
   1008      * file will be a path to a sub-directory of the given type. Though these
   1009      * files are not automatically scanned by the media scanner, you can
   1010      * explicitly add them to the media database with
   1011      * {@link android.media.MediaScannerConnection#scanFile(Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener)
   1012      * MediaScannerConnection.scanFile}. Note that this is not the same as
   1013      * {@link android.os.Environment#getExternalStoragePublicDirectory
   1014      * Environment.getExternalStoragePublicDirectory()}, which provides
   1015      * directories of media shared by all applications. The directories returned
   1016      * here are owned by the application, and their contents will be removed
   1017      * when the application is uninstalled. Unlike
   1018      * {@link android.os.Environment#getExternalStoragePublicDirectory
   1019      * Environment.getExternalStoragePublicDirectory()}, the directory returned
   1020      * here will be automatically created for you.
   1021      * <p>
   1022      * Here is an example of typical code to manipulate a picture in an
   1023      * application's shared storage and add it to the media database:
   1024      * </p>
   1025      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
   1026      * private_picture}
   1027      *
   1028      * @param type The type of files directory to return. May be {@code null}
   1029      *            for the root of the files directory or one of the following
   1030      *            constants for a subdirectory:
   1031      *            {@link android.os.Environment#DIRECTORY_MUSIC},
   1032      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
   1033      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
   1034      *            {@link android.os.Environment#DIRECTORY_ALARMS},
   1035      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
   1036      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
   1037      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
   1038      * @return the absolute path to application-specific directory. May return
   1039      *         {@code null} if shared storage is not currently available.
   1040      * @see #getFilesDir
   1041      * @see #getExternalFilesDirs(String)
   1042      * @see Environment#getExternalStorageState(File)
   1043      * @see Environment#isExternalStorageEmulated(File)
   1044      * @see Environment#isExternalStorageRemovable(File)
   1045      */
   1046     @Nullable
   1047     public abstract File getExternalFilesDir(@Nullable String type);
   1048 
   1049     /**
   1050      * Returns absolute paths to application-specific directories on all
   1051      * shared/external storage devices where the application can place
   1052      * persistent files it owns. These files are internal to the application,
   1053      * and not typically visible to the user as media.
   1054      * <p>
   1055      * This is like {@link #getFilesDir()} in that these files will be deleted
   1056      * when the application is uninstalled, however there are some important
   1057      * differences:
   1058      * <ul>
   1059      * <li>Shared storage may not always be available, since removable media can
   1060      * be ejected by the user. Media state can be checked using
   1061      * {@link Environment#getExternalStorageState(File)}.
   1062      * <li>There is no security enforced with these files. For example, any
   1063      * application holding
   1064      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1065      * these files.
   1066      * </ul>
   1067      * <p>
   1068      * If a shared storage device is emulated (as determined by
   1069      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
   1070      * backed by a private user data partition, which means there is little
   1071      * benefit to storing data here instead of the private directories returned
   1072      * by {@link #getFilesDir()}, etc.
   1073      * <p>
   1074      * Shared storage devices returned here are considered a stable part of the
   1075      * device, including physical media slots under a protective cover. The
   1076      * returned paths do not include transient devices, such as USB flash drives
   1077      * connected to handheld devices.
   1078      * <p>
   1079      * An application may store data on any or all of the returned devices. For
   1080      * example, an app may choose to store large files on the device with the
   1081      * most available space, as measured by {@link StatFs}.
   1082      * <p>
   1083      * No additional permissions are required for the calling app to read or
   1084      * write files under the returned path. Write access outside of these paths
   1085      * on secondary external storage devices is not available.
   1086      * <p>
   1087      * The returned path may change over time if different shared storage media
   1088      * is inserted, so only relative paths should be persisted.
   1089      *
   1090      * @param type The type of files directory to return. May be {@code null}
   1091      *            for the root of the files directory or one of the following
   1092      *            constants for a subdirectory:
   1093      *            {@link android.os.Environment#DIRECTORY_MUSIC},
   1094      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
   1095      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
   1096      *            {@link android.os.Environment#DIRECTORY_ALARMS},
   1097      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
   1098      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
   1099      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
   1100      * @return the absolute paths to application-specific directories. Some
   1101      *         individual paths may be {@code null} if that shared storage is
   1102      *         not currently available. The first path returned is the same as
   1103      *         {@link #getExternalFilesDir(String)}.
   1104      * @see #getExternalFilesDir(String)
   1105      * @see Environment#getExternalStorageState(File)
   1106      * @see Environment#isExternalStorageEmulated(File)
   1107      * @see Environment#isExternalStorageRemovable(File)
   1108      */
   1109     public abstract File[] getExternalFilesDirs(String type);
   1110 
   1111     /**
   1112      * Return the primary shared/external storage directory where this
   1113      * application's OBB files (if there are any) can be found. Note if the
   1114      * application does not have any OBB files, this directory may not exist.
   1115      * <p>
   1116      * This is like {@link #getFilesDir()} in that these files will be deleted
   1117      * when the application is uninstalled, however there are some important
   1118      * differences:
   1119      * <ul>
   1120      * <li>Shared storage may not always be available, since removable media can
   1121      * be ejected by the user. Media state can be checked using
   1122      * {@link Environment#getExternalStorageState(File)}.
   1123      * <li>There is no security enforced with these files. For example, any
   1124      * application holding
   1125      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1126      * these files.
   1127      * </ul>
   1128      * <p>
   1129      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
   1130      * are required to read or write to the returned path; it's always
   1131      * accessible to the calling app. This only applies to paths generated for
   1132      * package name of the calling application. To access paths belonging to
   1133      * other packages,
   1134      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
   1135      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
   1136      * <p>
   1137      * On devices with multiple users (as described by {@link UserManager}),
   1138      * multiple users may share the same OBB storage location. Applications
   1139      * should ensure that multiple instances running under different users don't
   1140      * interfere with each other.
   1141      *
   1142      * @return the absolute path to application-specific directory. May return
   1143      *         {@code null} if shared storage is not currently available.
   1144      * @see #getObbDirs()
   1145      * @see Environment#getExternalStorageState(File)
   1146      * @see Environment#isExternalStorageEmulated(File)
   1147      * @see Environment#isExternalStorageRemovable(File)
   1148      */
   1149     public abstract File getObbDir();
   1150 
   1151     /**
   1152      * Returns absolute paths to application-specific directories on all
   1153      * shared/external storage devices where the application's OBB files (if
   1154      * there are any) can be found. Note if the application does not have any
   1155      * OBB files, these directories may not exist.
   1156      * <p>
   1157      * This is like {@link #getFilesDir()} in that these files will be deleted
   1158      * when the application is uninstalled, however there are some important
   1159      * differences:
   1160      * <ul>
   1161      * <li>Shared storage may not always be available, since removable media can
   1162      * be ejected by the user. Media state can be checked using
   1163      * {@link Environment#getExternalStorageState(File)}.
   1164      * <li>There is no security enforced with these files. For example, any
   1165      * application holding
   1166      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1167      * these files.
   1168      * </ul>
   1169      * <p>
   1170      * Shared storage devices returned here are considered a stable part of the
   1171      * device, including physical media slots under a protective cover. The
   1172      * returned paths do not include transient devices, such as USB flash drives
   1173      * connected to handheld devices.
   1174      * <p>
   1175      * An application may store data on any or all of the returned devices. For
   1176      * example, an app may choose to store large files on the device with the
   1177      * most available space, as measured by {@link StatFs}.
   1178      * <p>
   1179      * No additional permissions are required for the calling app to read or
   1180      * write files under the returned path. Write access outside of these paths
   1181      * on secondary external storage devices is not available.
   1182      *
   1183      * @return the absolute paths to application-specific directories. Some
   1184      *         individual paths may be {@code null} if that shared storage is
   1185      *         not currently available. The first path returned is the same as
   1186      *         {@link #getObbDir()}
   1187      * @see #getObbDir()
   1188      * @see Environment#getExternalStorageState(File)
   1189      * @see Environment#isExternalStorageEmulated(File)
   1190      * @see Environment#isExternalStorageRemovable(File)
   1191      */
   1192     public abstract File[] getObbDirs();
   1193 
   1194     /**
   1195      * Returns the absolute path to the application specific cache directory on
   1196      * the filesystem.
   1197      * <p>
   1198      * The system will automatically delete files in this directory as disk
   1199      * space is needed elsewhere on the device. The system will always delete
   1200      * older files first, as reported by {@link File#lastModified()}. If
   1201      * desired, you can exert more control over how files are deleted using
   1202      * {@link StorageManager#setCacheBehaviorGroup(File, boolean)} and
   1203      * {@link StorageManager#setCacheBehaviorTombstone(File, boolean)}.
   1204      * <p>
   1205      * Apps are strongly encouraged to keep their usage of cache space below the
   1206      * quota returned by
   1207      * {@link StorageManager#getCacheQuotaBytes(java.util.UUID)}. If your app
   1208      * goes above this quota, your cached files will be some of the first to be
   1209      * deleted when additional disk space is needed. Conversely, if your app
   1210      * stays under this quota, your cached files will be some of the last to be
   1211      * deleted when additional disk space is needed.
   1212      * <p>
   1213      * Note that your cache quota will change over time depending on how
   1214      * frequently the user interacts with your app, and depending on how much
   1215      * system-wide disk space is used.
   1216      * <p>
   1217      * The returned path may change over time if the calling app is moved to an
   1218      * adopted storage device, so only relative paths should be persisted.
   1219      * <p>
   1220      * Apps require no extra permissions to read or write to the returned path,
   1221      * since this path lives in their private storage.
   1222      *
   1223      * @return The path of the directory holding application cache files.
   1224      * @see #openFileOutput
   1225      * @see #getFileStreamPath
   1226      * @see #getDir
   1227      * @see #getExternalCacheDir
   1228      */
   1229     public abstract File getCacheDir();
   1230 
   1231     /**
   1232      * Returns the absolute path to the application specific cache directory on
   1233      * the filesystem designed for storing cached code.
   1234      * <p>
   1235      * The system will delete any files stored in this location both when your
   1236      * specific application is upgraded, and when the entire platform is
   1237      * upgraded.
   1238      * <p>
   1239      * This location is optimal for storing compiled or optimized code generated
   1240      * by your application at runtime.
   1241      * <p>
   1242      * The returned path may change over time if the calling app is moved to an
   1243      * adopted storage device, so only relative paths should be persisted.
   1244      * <p>
   1245      * Apps require no extra permissions to read or write to the returned path,
   1246      * since this path lives in their private storage.
   1247      *
   1248      * @return The path of the directory holding application code cache files.
   1249      */
   1250     public abstract File getCodeCacheDir();
   1251 
   1252     /**
   1253      * Returns absolute path to application-specific directory on the primary
   1254      * shared/external storage device where the application can place cache
   1255      * files it owns. These files are internal to the application, and not
   1256      * typically visible to the user as media.
   1257      * <p>
   1258      * This is like {@link #getCacheDir()} in that these files will be deleted
   1259      * when the application is uninstalled, however there are some important
   1260      * differences:
   1261      * <ul>
   1262      * <li>The platform does not always monitor the space available in shared
   1263      * storage, and thus may not automatically delete these files. Apps should
   1264      * always manage the maximum space used in this location. Currently the only
   1265      * time files here will be deleted by the platform is when running on
   1266      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
   1267      * {@link Environment#isExternalStorageEmulated(File)} returns true.
   1268      * <li>Shared storage may not always be available, since removable media can
   1269      * be ejected by the user. Media state can be checked using
   1270      * {@link Environment#getExternalStorageState(File)}.
   1271      * <li>There is no security enforced with these files. For example, any
   1272      * application holding
   1273      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1274      * these files.
   1275      * </ul>
   1276      * <p>
   1277      * If a shared storage device is emulated (as determined by
   1278      * {@link Environment#isExternalStorageEmulated(File)}), its contents are
   1279      * backed by a private user data partition, which means there is little
   1280      * benefit to storing data here instead of the private directory returned by
   1281      * {@link #getCacheDir()}.
   1282      * <p>
   1283      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
   1284      * are required to read or write to the returned path; it's always
   1285      * accessible to the calling app. This only applies to paths generated for
   1286      * package name of the calling application. To access paths belonging to
   1287      * other packages,
   1288      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
   1289      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
   1290      * <p>
   1291      * On devices with multiple users (as described by {@link UserManager}),
   1292      * each user has their own isolated shared storage. Applications only have
   1293      * access to the shared storage for the user they're running as.
   1294      * <p>
   1295      * The returned path may change over time if different shared storage media
   1296      * is inserted, so only relative paths should be persisted.
   1297      *
   1298      * @return the absolute path to application-specific directory. May return
   1299      *         {@code null} if shared storage is not currently available.
   1300      * @see #getCacheDir
   1301      * @see #getExternalCacheDirs()
   1302      * @see Environment#getExternalStorageState(File)
   1303      * @see Environment#isExternalStorageEmulated(File)
   1304      * @see Environment#isExternalStorageRemovable(File)
   1305      */
   1306     @Nullable
   1307     public abstract File getExternalCacheDir();
   1308 
   1309     /**
   1310      * Returns absolute path to application-specific directory in the preloaded cache.
   1311      * <p>Files stored in the cache directory can be deleted when the device runs low on storage.
   1312      * There is no guarantee when these files will be deleted.
   1313      * @hide
   1314      */
   1315     @Nullable
   1316     @SystemApi
   1317     public abstract File getPreloadsFileCache();
   1318 
   1319     /**
   1320      * Returns absolute paths to application-specific directories on all
   1321      * shared/external storage devices where the application can place cache
   1322      * files it owns. These files are internal to the application, and not
   1323      * typically visible to the user as media.
   1324      * <p>
   1325      * This is like {@link #getCacheDir()} in that these files will be deleted
   1326      * when the application is uninstalled, however there are some important
   1327      * differences:
   1328      * <ul>
   1329      * <li>The platform does not always monitor the space available in shared
   1330      * storage, and thus may not automatically delete these files. Apps should
   1331      * always manage the maximum space used in this location. Currently the only
   1332      * time files here will be deleted by the platform is when running on
   1333      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
   1334      * {@link Environment#isExternalStorageEmulated(File)} returns true.
   1335      * <li>Shared storage may not always be available, since removable media can
   1336      * be ejected by the user. Media state can be checked using
   1337      * {@link Environment#getExternalStorageState(File)}.
   1338      * <li>There is no security enforced with these files. For example, any
   1339      * application holding
   1340      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1341      * these files.
   1342      * </ul>
   1343      * <p>
   1344      * If a shared storage device is emulated (as determined by
   1345      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
   1346      * backed by a private user data partition, which means there is little
   1347      * benefit to storing data here instead of the private directory returned by
   1348      * {@link #getCacheDir()}.
   1349      * <p>
   1350      * Shared storage devices returned here are considered a stable part of the
   1351      * device, including physical media slots under a protective cover. The
   1352      * returned paths do not include transient devices, such as USB flash drives
   1353      * connected to handheld devices.
   1354      * <p>
   1355      * An application may store data on any or all of the returned devices. For
   1356      * example, an app may choose to store large files on the device with the
   1357      * most available space, as measured by {@link StatFs}.
   1358      * <p>
   1359      * No additional permissions are required for the calling app to read or
   1360      * write files under the returned path. Write access outside of these paths
   1361      * on secondary external storage devices is not available.
   1362      * <p>
   1363      * The returned paths may change over time if different shared storage media
   1364      * is inserted, so only relative paths should be persisted.
   1365      *
   1366      * @return the absolute paths to application-specific directories. Some
   1367      *         individual paths may be {@code null} if that shared storage is
   1368      *         not currently available. The first path returned is the same as
   1369      *         {@link #getExternalCacheDir()}.
   1370      * @see #getExternalCacheDir()
   1371      * @see Environment#getExternalStorageState(File)
   1372      * @see Environment#isExternalStorageEmulated(File)
   1373      * @see Environment#isExternalStorageRemovable(File)
   1374      */
   1375     public abstract File[] getExternalCacheDirs();
   1376 
   1377     /**
   1378      * Returns absolute paths to application-specific directories on all
   1379      * shared/external storage devices where the application can place media
   1380      * files. These files are scanned and made available to other apps through
   1381      * {@link MediaStore}.
   1382      * <p>
   1383      * This is like {@link #getExternalFilesDirs} in that these files will be
   1384      * deleted when the application is uninstalled, however there are some
   1385      * important differences:
   1386      * <ul>
   1387      * <li>Shared storage may not always be available, since removable media can
   1388      * be ejected by the user. Media state can be checked using
   1389      * {@link Environment#getExternalStorageState(File)}.
   1390      * <li>There is no security enforced with these files. For example, any
   1391      * application holding
   1392      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1393      * these files.
   1394      * </ul>
   1395      * <p>
   1396      * Shared storage devices returned here are considered a stable part of the
   1397      * device, including physical media slots under a protective cover. The
   1398      * returned paths do not include transient devices, such as USB flash drives
   1399      * connected to handheld devices.
   1400      * <p>
   1401      * An application may store data on any or all of the returned devices. For
   1402      * example, an app may choose to store large files on the device with the
   1403      * most available space, as measured by {@link StatFs}.
   1404      * <p>
   1405      * No additional permissions are required for the calling app to read or
   1406      * write files under the returned path. Write access outside of these paths
   1407      * on secondary external storage devices is not available.
   1408      * <p>
   1409      * The returned paths may change over time if different shared storage media
   1410      * is inserted, so only relative paths should be persisted.
   1411      *
   1412      * @return the absolute paths to application-specific directories. Some
   1413      *         individual paths may be {@code null} if that shared storage is
   1414      *         not currently available.
   1415      * @see Environment#getExternalStorageState(File)
   1416      * @see Environment#isExternalStorageEmulated(File)
   1417      * @see Environment#isExternalStorageRemovable(File)
   1418      */
   1419     public abstract File[] getExternalMediaDirs();
   1420 
   1421     /**
   1422      * Returns an array of strings naming the private files associated with
   1423      * this Context's application package.
   1424      *
   1425      * @return Array of strings naming the private files.
   1426      *
   1427      * @see #openFileInput
   1428      * @see #openFileOutput
   1429      * @see #deleteFile
   1430      */
   1431     public abstract String[] fileList();
   1432 
   1433     /**
   1434      * Retrieve, creating if needed, a new directory in which the application
   1435      * can place its own custom data files.  You can use the returned File
   1436      * object to create and access files in this directory.  Note that files
   1437      * created through a File object will only be accessible by your own
   1438      * application; you can only set the mode of the entire directory, not
   1439      * of individual files.
   1440      * <p>
   1441      * The returned path may change over time if the calling app is moved to an
   1442      * adopted storage device, so only relative paths should be persisted.
   1443      * <p>
   1444      * Apps require no extra permissions to read or write to the returned path,
   1445      * since this path lives in their private storage.
   1446      *
   1447      * @param name Name of the directory to retrieve.  This is a directory
   1448      * that is created as part of your application data.
   1449      * @param mode Operating mode.
   1450      *
   1451      * @return A {@link File} object for the requested directory.  The directory
   1452      * will have been created if it does not already exist.
   1453      *
   1454      * @see #openFileOutput(String, int)
   1455      */
   1456     public abstract File getDir(String name, @FileMode int mode);
   1457 
   1458     /**
   1459      * Open a new private SQLiteDatabase associated with this Context's
   1460      * application package. Create the database file if it doesn't exist.
   1461      *
   1462      * @param name The name (unique in the application package) of the database.
   1463      * @param mode Operating mode.
   1464      * @param factory An optional factory class that is called to instantiate a
   1465      *            cursor when query is called.
   1466      * @return The contents of a newly created database with the given name.
   1467      * @throws android.database.sqlite.SQLiteException if the database file
   1468      *             could not be opened.
   1469      * @see #MODE_PRIVATE
   1470      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
   1471      * @see #MODE_NO_LOCALIZED_COLLATORS
   1472      * @see #deleteDatabase
   1473      */
   1474     public abstract SQLiteDatabase openOrCreateDatabase(String name,
   1475             @DatabaseMode int mode, CursorFactory factory);
   1476 
   1477     /**
   1478      * Open a new private SQLiteDatabase associated with this Context's
   1479      * application package. Creates the database file if it doesn't exist.
   1480      * <p>
   1481      * Accepts input param: a concrete instance of {@link DatabaseErrorHandler}
   1482      * to be used to handle corruption when sqlite reports database corruption.
   1483      * </p>
   1484      *
   1485      * @param name The name (unique in the application package) of the database.
   1486      * @param mode Operating mode.
   1487      * @param factory An optional factory class that is called to instantiate a
   1488      *            cursor when query is called.
   1489      * @param errorHandler the {@link DatabaseErrorHandler} to be used when
   1490      *            sqlite reports database corruption. if null,
   1491      *            {@link android.database.DefaultDatabaseErrorHandler} is
   1492      *            assumed.
   1493      * @return The contents of a newly created database with the given name.
   1494      * @throws android.database.sqlite.SQLiteException if the database file
   1495      *             could not be opened.
   1496      * @see #MODE_PRIVATE
   1497      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
   1498      * @see #MODE_NO_LOCALIZED_COLLATORS
   1499      * @see #deleteDatabase
   1500      */
   1501     public abstract SQLiteDatabase openOrCreateDatabase(String name,
   1502             @DatabaseMode int mode, CursorFactory factory,
   1503             @Nullable DatabaseErrorHandler errorHandler);
   1504 
   1505     /**
   1506      * Move an existing database file from the given source storage context to
   1507      * this context. This is typically used to migrate data between storage
   1508      * locations after an upgrade, such as migrating to device protected
   1509      * storage.
   1510      * <p>
   1511      * The database must be closed before being moved.
   1512      *
   1513      * @param sourceContext The source context which contains the existing
   1514      *            database to move.
   1515      * @param name The name of the database file.
   1516      * @return {@code true} if the move was successful or if the database didn't
   1517      *         exist in the source context, otherwise {@code false}.
   1518      * @see #createDeviceProtectedStorageContext()
   1519      */
   1520     public abstract boolean moveDatabaseFrom(Context sourceContext, String name);
   1521 
   1522     /**
   1523      * Delete an existing private SQLiteDatabase associated with this Context's
   1524      * application package.
   1525      *
   1526      * @param name The name (unique in the application package) of the
   1527      *             database.
   1528      *
   1529      * @return {@code true} if the database was successfully deleted; else {@code false}.
   1530      *
   1531      * @see #openOrCreateDatabase
   1532      */
   1533     public abstract boolean deleteDatabase(String name);
   1534 
   1535     /**
   1536      * Returns the absolute path on the filesystem where a database created with
   1537      * {@link #openOrCreateDatabase} is stored.
   1538      * <p>
   1539      * The returned path may change over time if the calling app is moved to an
   1540      * adopted storage device, so only relative paths should be persisted.
   1541      *
   1542      * @param name The name of the database for which you would like to get
   1543      *          its path.
   1544      *
   1545      * @return An absolute path to the given database.
   1546      *
   1547      * @see #openOrCreateDatabase
   1548      */
   1549     public abstract File getDatabasePath(String name);
   1550 
   1551     /**
   1552      * Returns an array of strings naming the private databases associated with
   1553      * this Context's application package.
   1554      *
   1555      * @return Array of strings naming the private databases.
   1556      *
   1557      * @see #openOrCreateDatabase
   1558      * @see #deleteDatabase
   1559      */
   1560     public abstract String[] databaseList();
   1561 
   1562     /**
   1563      * @deprecated Use {@link android.app.WallpaperManager#getDrawable
   1564      * WallpaperManager.get()} instead.
   1565      */
   1566     @Deprecated
   1567     public abstract Drawable getWallpaper();
   1568 
   1569     /**
   1570      * @deprecated Use {@link android.app.WallpaperManager#peekDrawable
   1571      * WallpaperManager.peek()} instead.
   1572      */
   1573     @Deprecated
   1574     public abstract Drawable peekWallpaper();
   1575 
   1576     /**
   1577      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumWidth()
   1578      * WallpaperManager.getDesiredMinimumWidth()} instead.
   1579      */
   1580     @Deprecated
   1581     public abstract int getWallpaperDesiredMinimumWidth();
   1582 
   1583     /**
   1584      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumHeight()
   1585      * WallpaperManager.getDesiredMinimumHeight()} instead.
   1586      */
   1587     @Deprecated
   1588     public abstract int getWallpaperDesiredMinimumHeight();
   1589 
   1590     /**
   1591      * @deprecated Use {@link android.app.WallpaperManager#setBitmap(Bitmap)
   1592      * WallpaperManager.set()} instead.
   1593      * <p>This method requires the caller to hold the permission
   1594      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1595      */
   1596     @Deprecated
   1597     public abstract void setWallpaper(Bitmap bitmap) throws IOException;
   1598 
   1599     /**
   1600      * @deprecated Use {@link android.app.WallpaperManager#setStream(InputStream)
   1601      * WallpaperManager.set()} instead.
   1602      * <p>This method requires the caller to hold the permission
   1603      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1604      */
   1605     @Deprecated
   1606     public abstract void setWallpaper(InputStream data) throws IOException;
   1607 
   1608     /**
   1609      * @deprecated Use {@link android.app.WallpaperManager#clear
   1610      * WallpaperManager.clear()} instead.
   1611      * <p>This method requires the caller to hold the permission
   1612      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1613      */
   1614     @Deprecated
   1615     public abstract void clearWallpaper() throws IOException;
   1616 
   1617     /**
   1618      * Same as {@link #startActivity(Intent, Bundle)} with no options
   1619      * specified.
   1620      *
   1621      * @param intent The description of the activity to start.
   1622      *
   1623      * @throws ActivityNotFoundException &nbsp;
   1624      *`
   1625      * @see #startActivity(Intent, Bundle)
   1626      * @see PackageManager#resolveActivity
   1627      */
   1628     public abstract void startActivity(@RequiresPermission Intent intent);
   1629 
   1630     /**
   1631      * Version of {@link #startActivity(Intent)} that allows you to specify the
   1632      * user the activity will be started for.  This is not available to applications
   1633      * that are not pre-installed on the system image.
   1634      * @param intent The description of the activity to start.
   1635      * @param user The UserHandle of the user to start this activity for.
   1636      * @throws ActivityNotFoundException &nbsp;
   1637      * @hide
   1638      */
   1639     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
   1640     public void startActivityAsUser(@RequiresPermission Intent intent, UserHandle user) {
   1641         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1642     }
   1643 
   1644     /**
   1645      * Launch a new activity.  You will not receive any information about when
   1646      * the activity exits.
   1647      *
   1648      * <p>Note that if this method is being called from outside of an
   1649      * {@link android.app.Activity} Context, then the Intent must include
   1650      * the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag.  This is because,
   1651      * without being started from an existing Activity, there is no existing
   1652      * task in which to place the new activity and thus it needs to be placed
   1653      * in its own separate task.
   1654      *
   1655      * <p>This method throws {@link ActivityNotFoundException}
   1656      * if there was no Activity found to run the given Intent.
   1657      *
   1658      * @param intent The description of the activity to start.
   1659      * @param options Additional options for how the Activity should be started.
   1660      * May be null if there are no options.  See {@link android.app.ActivityOptions}
   1661      * for how to build the Bundle supplied here; there are no supported definitions
   1662      * for building it manually.
   1663      *
   1664      * @throws ActivityNotFoundException &nbsp;
   1665      *
   1666      * @see #startActivity(Intent)
   1667      * @see PackageManager#resolveActivity
   1668      */
   1669     public abstract void startActivity(@RequiresPermission Intent intent,
   1670             @Nullable Bundle options);
   1671 
   1672     /**
   1673      * Version of {@link #startActivity(Intent, Bundle)} that allows you to specify the
   1674      * user the activity will be started for.  This is not available to applications
   1675      * that are not pre-installed on the system image.
   1676      * @param intent The description of the activity to start.
   1677      * @param options Additional options for how the Activity should be started.
   1678      * May be null if there are no options.  See {@link android.app.ActivityOptions}
   1679      * for how to build the Bundle supplied here; there are no supported definitions
   1680      * for building it manually.
   1681      * @param userId The UserHandle of the user to start this activity for.
   1682      * @throws ActivityNotFoundException &nbsp;
   1683      * @hide
   1684      */
   1685     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
   1686     public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
   1687             UserHandle userId) {
   1688         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1689     }
   1690 
   1691     /**
   1692      * Version of {@link #startActivity(Intent, Bundle)} that returns a result to the caller. This
   1693      * is only supported for Views and Fragments.
   1694      * @param who The identifier for the calling element that will receive the result.
   1695      * @param intent The intent to start.
   1696      * @param requestCode The code that will be returned with onActivityResult() identifying this
   1697      *          request.
   1698      * @param options Additional options for how the Activity should be started.
   1699      *          May be null if there are no options.  See {@link android.app.ActivityOptions}
   1700      *          for how to build the Bundle supplied here; there are no supported definitions
   1701      *          for building it manually.
   1702      * @hide
   1703      */
   1704     public void startActivityForResult(
   1705             @NonNull String who, Intent intent, int requestCode, @Nullable Bundle options) {
   1706         throw new RuntimeException("This method is only implemented for Activity-based Contexts. "
   1707                 + "Check canStartActivityForResult() before calling.");
   1708     }
   1709 
   1710     /**
   1711      * Identifies whether this Context instance will be able to process calls to
   1712      * {@link #startActivityForResult(String, Intent, int, Bundle)}.
   1713      * @hide
   1714      */
   1715     public boolean canStartActivityForResult() {
   1716         return false;
   1717     }
   1718 
   1719     /**
   1720      * Same as {@link #startActivities(Intent[], Bundle)} with no options
   1721      * specified.
   1722      *
   1723      * @param intents An array of Intents to be started.
   1724      *
   1725      * @throws ActivityNotFoundException &nbsp;
   1726      *
   1727      * @see #startActivities(Intent[], Bundle)
   1728      * @see PackageManager#resolveActivity
   1729      */
   1730     public abstract void startActivities(@RequiresPermission Intent[] intents);
   1731 
   1732     /**
   1733      * Launch multiple new activities.  This is generally the same as calling
   1734      * {@link #startActivity(Intent)} for the first Intent in the array,
   1735      * that activity during its creation calling {@link #startActivity(Intent)}
   1736      * for the second entry, etc.  Note that unlike that approach, generally
   1737      * none of the activities except the last in the array will be created
   1738      * at this point, but rather will be created when the user first visits
   1739      * them (due to pressing back from the activity on top).
   1740      *
   1741      * <p>This method throws {@link ActivityNotFoundException}
   1742      * if there was no Activity found for <em>any</em> given Intent.  In this
   1743      * case the state of the activity stack is undefined (some Intents in the
   1744      * list may be on it, some not), so you probably want to avoid such situations.
   1745      *
   1746      * @param intents An array of Intents to be started.
   1747      * @param options Additional options for how the Activity should be started.
   1748      * See {@link android.content.Context#startActivity(Intent, Bundle)}
   1749      * Context.startActivity(Intent, Bundle)} for more details.
   1750      *
   1751      * @throws ActivityNotFoundException &nbsp;
   1752      *
   1753      * @see #startActivities(Intent[])
   1754      * @see PackageManager#resolveActivity
   1755      */
   1756     public abstract void startActivities(@RequiresPermission Intent[] intents, Bundle options);
   1757 
   1758     /**
   1759      * @hide
   1760      * Launch multiple new activities.  This is generally the same as calling
   1761      * {@link #startActivity(Intent)} for the first Intent in the array,
   1762      * that activity during its creation calling {@link #startActivity(Intent)}
   1763      * for the second entry, etc.  Note that unlike that approach, generally
   1764      * none of the activities except the last in the array will be created
   1765      * at this point, but rather will be created when the user first visits
   1766      * them (due to pressing back from the activity on top).
   1767      *
   1768      * <p>This method throws {@link ActivityNotFoundException}
   1769      * if there was no Activity found for <em>any</em> given Intent.  In this
   1770      * case the state of the activity stack is undefined (some Intents in the
   1771      * list may be on it, some not), so you probably want to avoid such situations.
   1772      *
   1773      * @param intents An array of Intents to be started.
   1774      * @param options Additional options for how the Activity should be started.
   1775      * @param userHandle The user for whom to launch the activities
   1776      * See {@link android.content.Context#startActivity(Intent, Bundle)}
   1777      * Context.startActivity(Intent, Bundle)} for more details.
   1778      *
   1779      * @throws ActivityNotFoundException &nbsp;
   1780      *
   1781      * @see #startActivities(Intent[])
   1782      * @see PackageManager#resolveActivity
   1783      */
   1784     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
   1785     public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
   1786         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1787     }
   1788 
   1789     /**
   1790      * Same as {@link #startIntentSender(IntentSender, Intent, int, int, int, Bundle)}
   1791      * with no options specified.
   1792      *
   1793      * @param intent The IntentSender to launch.
   1794      * @param fillInIntent If non-null, this will be provided as the
   1795      * intent parameter to {@link IntentSender#sendIntent}.
   1796      * @param flagsMask Intent flags in the original IntentSender that you
   1797      * would like to change.
   1798      * @param flagsValues Desired values for any bits set in
   1799      * <var>flagsMask</var>
   1800      * @param extraFlags Always set to 0.
   1801      *
   1802      * @see #startActivity(Intent)
   1803      * @see #startIntentSender(IntentSender, Intent, int, int, int, Bundle)
   1804      */
   1805     public abstract void startIntentSender(IntentSender intent, @Nullable Intent fillInIntent,
   1806             @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues,
   1807             int extraFlags) throws IntentSender.SendIntentException;
   1808 
   1809     /**
   1810      * Like {@link #startActivity(Intent, Bundle)}, but taking a IntentSender
   1811      * to start.  If the IntentSender is for an activity, that activity will be started
   1812      * as if you had called the regular {@link #startActivity(Intent)}
   1813      * here; otherwise, its associated action will be executed (such as
   1814      * sending a broadcast) as if you had called
   1815      * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
   1816      *
   1817      * @param intent The IntentSender to launch.
   1818      * @param fillInIntent If non-null, this will be provided as the
   1819      * intent parameter to {@link IntentSender#sendIntent}.
   1820      * @param flagsMask Intent flags in the original IntentSender that you
   1821      * would like to change.
   1822      * @param flagsValues Desired values for any bits set in
   1823      * <var>flagsMask</var>
   1824      * @param extraFlags Always set to 0.
   1825      * @param options Additional options for how the Activity should be started.
   1826      * See {@link android.content.Context#startActivity(Intent, Bundle)}
   1827      * Context.startActivity(Intent, Bundle)} for more details.  If options
   1828      * have also been supplied by the IntentSender, options given here will
   1829      * override any that conflict with those given by the IntentSender.
   1830      *
   1831      * @see #startActivity(Intent, Bundle)
   1832      * @see #startIntentSender(IntentSender, Intent, int, int, int)
   1833      */
   1834     public abstract void startIntentSender(IntentSender intent, @Nullable Intent fillInIntent,
   1835             @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues,
   1836             int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException;
   1837 
   1838     /**
   1839      * Broadcast the given intent to all interested BroadcastReceivers.  This
   1840      * call is asynchronous; it returns immediately, and you will continue
   1841      * executing while the receivers are run.  No results are propagated from
   1842      * receivers and receivers can not abort the broadcast. If you want
   1843      * to allow receivers to propagate results or abort the broadcast, you must
   1844      * send an ordered broadcast using
   1845      * {@link #sendOrderedBroadcast(Intent, String)}.
   1846      *
   1847      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1848      *
   1849      * @param intent The Intent to broadcast; all receivers matching this
   1850      *               Intent will receive the broadcast.
   1851      *
   1852      * @see android.content.BroadcastReceiver
   1853      * @see #registerReceiver
   1854      * @see #sendBroadcast(Intent, String)
   1855      * @see #sendOrderedBroadcast(Intent, String)
   1856      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1857      */
   1858     public abstract void sendBroadcast(@RequiresPermission Intent intent);
   1859 
   1860     /**
   1861      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1862      * an optional required permission to be enforced.  This
   1863      * call is asynchronous; it returns immediately, and you will continue
   1864      * executing while the receivers are run.  No results are propagated from
   1865      * receivers and receivers can not abort the broadcast. If you want
   1866      * to allow receivers to propagate results or abort the broadcast, you must
   1867      * send an ordered broadcast using
   1868      * {@link #sendOrderedBroadcast(Intent, String)}.
   1869      *
   1870      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1871      *
   1872      * @param intent The Intent to broadcast; all receivers matching this
   1873      *               Intent will receive the broadcast.
   1874      * @param receiverPermission (optional) String naming a permission that
   1875      *               a receiver must hold in order to receive your broadcast.
   1876      *               If null, no permission is required.
   1877      *
   1878      * @see android.content.BroadcastReceiver
   1879      * @see #registerReceiver
   1880      * @see #sendBroadcast(Intent)
   1881      * @see #sendOrderedBroadcast(Intent, String)
   1882      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1883      */
   1884     public abstract void sendBroadcast(@RequiresPermission Intent intent,
   1885             @Nullable String receiverPermission);
   1886 
   1887 
   1888     /**
   1889      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1890      * an array of required permissions to be enforced.  This call is asynchronous; it returns
   1891      * immediately, and you will continue executing while the receivers are run.  No results are
   1892      * propagated from receivers and receivers can not abort the broadcast. If you want to allow
   1893      * receivers to propagate results or abort the broadcast, you must send an ordered broadcast
   1894      * using {@link #sendOrderedBroadcast(Intent, String)}.
   1895      *
   1896      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1897      *
   1898      * @param intent The Intent to broadcast; all receivers matching this
   1899      *               Intent will receive the broadcast.
   1900      * @param receiverPermissions Array of names of permissions that a receiver must hold
   1901      *                            in order to receive your broadcast.
   1902      *                            If null or empty, no permissions are required.
   1903      *
   1904      * @see android.content.BroadcastReceiver
   1905      * @see #registerReceiver
   1906      * @see #sendBroadcast(Intent)
   1907      * @see #sendOrderedBroadcast(Intent, String)
   1908      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1909      * @hide
   1910      */
   1911     public abstract void sendBroadcastMultiplePermissions(Intent intent,
   1912             String[] receiverPermissions);
   1913 
   1914     /**
   1915      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1916      * an optional required permission to be enforced.  This
   1917      * call is asynchronous; it returns immediately, and you will continue
   1918      * executing while the receivers are run.  No results are propagated from
   1919      * receivers and receivers can not abort the broadcast. If you want
   1920      * to allow receivers to propagate results or abort the broadcast, you must
   1921      * send an ordered broadcast using
   1922      * {@link #sendOrderedBroadcast(Intent, String)}.
   1923      *
   1924      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1925      *
   1926      * @param intent The Intent to broadcast; all receivers matching this
   1927      *               Intent will receive the broadcast.
   1928      * @param receiverPermission (optional) String naming a permission that
   1929      *               a receiver must hold in order to receive your broadcast.
   1930      *               If null, no permission is required.
   1931      * @param options (optional) Additional sending options, generated from a
   1932      * {@link android.app.BroadcastOptions}.
   1933      *
   1934      * @see android.content.BroadcastReceiver
   1935      * @see #registerReceiver
   1936      * @see #sendBroadcast(Intent)
   1937      * @see #sendOrderedBroadcast(Intent, String)
   1938      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1939      * @hide
   1940      */
   1941     @SystemApi
   1942     public abstract void sendBroadcast(Intent intent,
   1943             @Nullable String receiverPermission,
   1944             @Nullable Bundle options);
   1945 
   1946     /**
   1947      * Like {@link #sendBroadcast(Intent, String)}, but also allows specification
   1948      * of an associated app op as per {@link android.app.AppOpsManager}.
   1949      * @hide
   1950      */
   1951     public abstract void sendBroadcast(Intent intent,
   1952             String receiverPermission, int appOp);
   1953 
   1954     /**
   1955      * Broadcast the given intent to all interested BroadcastReceivers, delivering
   1956      * them one at a time to allow more preferred receivers to consume the
   1957      * broadcast before it is delivered to less preferred receivers.  This
   1958      * call is asynchronous; it returns immediately, and you will continue
   1959      * executing while the receivers are run.
   1960      *
   1961      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1962      *
   1963      * @param intent The Intent to broadcast; all receivers matching this
   1964      *               Intent will receive the broadcast.
   1965      * @param receiverPermission (optional) String naming a permissions that
   1966      *               a receiver must hold in order to receive your broadcast.
   1967      *               If null, no permission is required.
   1968      *
   1969      * @see android.content.BroadcastReceiver
   1970      * @see #registerReceiver
   1971      * @see #sendBroadcast(Intent)
   1972      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1973      */
   1974     public abstract void sendOrderedBroadcast(@RequiresPermission Intent intent,
   1975             @Nullable String receiverPermission);
   1976 
   1977     /**
   1978      * Version of {@link #sendBroadcast(Intent)} that allows you to
   1979      * receive data back from the broadcast.  This is accomplished by
   1980      * supplying your own BroadcastReceiver when calling, which will be
   1981      * treated as a final receiver at the end of the broadcast -- its
   1982      * {@link BroadcastReceiver#onReceive} method will be called with
   1983      * the result values collected from the other receivers.  The broadcast will
   1984      * be serialized in the same way as calling
   1985      * {@link #sendOrderedBroadcast(Intent, String)}.
   1986      *
   1987      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   1988      * asynchronous; it will return before
   1989      * resultReceiver.onReceive() is called.
   1990      *
   1991      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1992      *
   1993      * @param intent The Intent to broadcast; all receivers matching this
   1994      *               Intent will receive the broadcast.
   1995      * @param receiverPermission String naming a permissions that
   1996      *               a receiver must hold in order to receive your broadcast.
   1997      *               If null, no permission is required.
   1998      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   1999      *                       receiver of the broadcast.
   2000      * @param scheduler A custom Handler with which to schedule the
   2001      *                  resultReceiver callback; if null it will be
   2002      *                  scheduled in the Context's main thread.
   2003      * @param initialCode An initial value for the result code.  Often
   2004      *                    Activity.RESULT_OK.
   2005      * @param initialData An initial value for the result data.  Often
   2006      *                    null.
   2007      * @param initialExtras An initial value for the result extras.  Often
   2008      *                      null.
   2009      *
   2010      * @see #sendBroadcast(Intent)
   2011      * @see #sendBroadcast(Intent, String)
   2012      * @see #sendOrderedBroadcast(Intent, String)
   2013      * @see android.content.BroadcastReceiver
   2014      * @see #registerReceiver
   2015      * @see android.app.Activity#RESULT_OK
   2016      */
   2017     public abstract void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent,
   2018             @Nullable String receiverPermission, @Nullable BroadcastReceiver resultReceiver,
   2019             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2020             @Nullable Bundle initialExtras);
   2021 
   2022     /**
   2023      * Version of {@link #sendBroadcast(Intent)} that allows you to
   2024      * receive data back from the broadcast.  This is accomplished by
   2025      * supplying your own BroadcastReceiver when calling, which will be
   2026      * treated as a final receiver at the end of the broadcast -- its
   2027      * {@link BroadcastReceiver#onReceive} method will be called with
   2028      * the result values collected from the other receivers.  The broadcast will
   2029      * be serialized in the same way as calling
   2030      * {@link #sendOrderedBroadcast(Intent, String)}.
   2031      *
   2032      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   2033      * asynchronous; it will return before
   2034      * resultReceiver.onReceive() is called.
   2035      *
   2036      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2037      *
   2038      *
   2039      * @param intent The Intent to broadcast; all receivers matching this
   2040      *               Intent will receive the broadcast.
   2041      * @param receiverPermission String naming a permissions that
   2042      *               a receiver must hold in order to receive your broadcast.
   2043      *               If null, no permission is required.
   2044      * @param options (optional) Additional sending options, generated from a
   2045      * {@link android.app.BroadcastOptions}.
   2046      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2047      *                       receiver of the broadcast.
   2048      * @param scheduler A custom Handler with which to schedule the
   2049      *                  resultReceiver callback; if null it will be
   2050      *                  scheduled in the Context's main thread.
   2051      * @param initialCode An initial value for the result code.  Often
   2052      *                    Activity.RESULT_OK.
   2053      * @param initialData An initial value for the result data.  Often
   2054      *                    null.
   2055      * @param initialExtras An initial value for the result extras.  Often
   2056      *                      null.
   2057      * @see #sendBroadcast(Intent)
   2058      * @see #sendBroadcast(Intent, String)
   2059      * @see #sendOrderedBroadcast(Intent, String)
   2060      * @see android.content.BroadcastReceiver
   2061      * @see #registerReceiver
   2062      * @see android.app.Activity#RESULT_OK
   2063      * @hide
   2064      */
   2065     @SystemApi
   2066     public abstract void sendOrderedBroadcast(@NonNull Intent intent,
   2067             @Nullable String receiverPermission, @Nullable Bundle options,
   2068             @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
   2069             int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras);
   2070 
   2071     /**
   2072      * Like {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler,
   2073      * int, String, android.os.Bundle)}, but also allows specification
   2074      * of an associated app op as per {@link android.app.AppOpsManager}.
   2075      * @hide
   2076      */
   2077     public abstract void sendOrderedBroadcast(Intent intent,
   2078             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
   2079             Handler scheduler, int initialCode, String initialData,
   2080             Bundle initialExtras);
   2081 
   2082     /**
   2083      * Version of {@link #sendBroadcast(Intent)} that allows you to specify the
   2084      * user the broadcast will be sent to.  This is not available to applications
   2085      * that are not pre-installed on the system image.
   2086      * @param intent The intent to broadcast
   2087      * @param user UserHandle to send the intent to.
   2088      * @see #sendBroadcast(Intent)
   2089      */
   2090     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2091     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2092             UserHandle user);
   2093 
   2094     /**
   2095      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
   2096      * user the broadcast will be sent to.  This is not available to applications
   2097      * that are not pre-installed on the system image.
   2098      *
   2099      * @param intent The Intent to broadcast; all receivers matching this
   2100      *               Intent will receive the broadcast.
   2101      * @param user UserHandle to send the intent to.
   2102      * @param receiverPermission (optional) String naming a permission that
   2103      *               a receiver must hold in order to receive your broadcast.
   2104      *               If null, no permission is required.
   2105      *
   2106      * @see #sendBroadcast(Intent, String)
   2107      */
   2108     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2109     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2110             UserHandle user, @Nullable String receiverPermission);
   2111 
   2112     /**
   2113      * Version of {@link #sendBroadcast(Intent, String, Bundle)} that allows you to specify the
   2114      * user the broadcast will be sent to.  This is not available to applications
   2115      * that are not pre-installed on the system image.
   2116      *
   2117      * @param intent The Intent to broadcast; all receivers matching this
   2118      *               Intent will receive the broadcast.
   2119      * @param user UserHandle to send the intent to.
   2120      * @param receiverPermission (optional) String naming a permission that
   2121      *               a receiver must hold in order to receive your broadcast.
   2122      *               If null, no permission is required.
   2123      * @param options (optional) Additional sending options, generated from a
   2124      * {@link android.app.BroadcastOptions}.
   2125      *
   2126      * @see #sendBroadcast(Intent, String, Bundle)
   2127      * @hide
   2128      */
   2129     @SystemApi
   2130     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2131     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2132             UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options);
   2133 
   2134     /**
   2135      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
   2136      * user the broadcast will be sent to.  This is not available to applications
   2137      * that are not pre-installed on the system image.
   2138      *
   2139      * @param intent The Intent to broadcast; all receivers matching this
   2140      *               Intent will receive the broadcast.
   2141      * @param user UserHandle to send the intent to.
   2142      * @param receiverPermission (optional) String naming a permission that
   2143      *               a receiver must hold in order to receive your broadcast.
   2144      *               If null, no permission is required.
   2145      * @param appOp The app op associated with the broadcast.
   2146      *
   2147      * @see #sendBroadcast(Intent, String)
   2148      *
   2149      * @hide
   2150      */
   2151     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2152     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2153             UserHandle user, @Nullable String receiverPermission, int appOp);
   2154 
   2155     /**
   2156      * Version of
   2157      * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)}
   2158      * that allows you to specify the
   2159      * user the broadcast will be sent to.  This is not available to applications
   2160      * that are not pre-installed on the system image.
   2161      *
   2162      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2163      *
   2164      * @param intent The Intent to broadcast; all receivers matching this
   2165      *               Intent will receive the broadcast.
   2166      * @param user UserHandle to send the intent to.
   2167      * @param receiverPermission String naming a permissions that
   2168      *               a receiver must hold in order to receive your broadcast.
   2169      *               If null, no permission is required.
   2170      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2171      *                       receiver of the broadcast.
   2172      * @param scheduler A custom Handler with which to schedule the
   2173      *                  resultReceiver callback; if null it will be
   2174      *                  scheduled in the Context's main thread.
   2175      * @param initialCode An initial value for the result code.  Often
   2176      *                    Activity.RESULT_OK.
   2177      * @param initialData An initial value for the result data.  Often
   2178      *                    null.
   2179      * @param initialExtras An initial value for the result extras.  Often
   2180      *                      null.
   2181      *
   2182      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   2183      */
   2184     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2185     public abstract void sendOrderedBroadcastAsUser(@RequiresPermission Intent intent,
   2186             UserHandle user, @Nullable String receiverPermission, BroadcastReceiver resultReceiver,
   2187             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2188             @Nullable  Bundle initialExtras);
   2189 
   2190     /**
   2191      * Similar to above but takes an appOp as well, to enforce restrictions.
   2192      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
   2193      *       BroadcastReceiver, Handler, int, String, Bundle)
   2194      * @hide
   2195      */
   2196     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2197     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
   2198             @Nullable String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
   2199             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2200             @Nullable  Bundle initialExtras);
   2201 
   2202     /**
   2203      * Similar to above but takes an appOp as well, to enforce restrictions, and an options Bundle.
   2204      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
   2205      *       BroadcastReceiver, Handler, int, String, Bundle)
   2206      * @hide
   2207      */
   2208     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2209     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
   2210             @Nullable String receiverPermission, int appOp, @Nullable Bundle options,
   2211             BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode,
   2212             @Nullable String initialData, @Nullable  Bundle initialExtras);
   2213 
   2214     /**
   2215      * <p>Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
   2216      * Intent you are sending stays around after the broadcast is complete,
   2217      * so that others can quickly retrieve that data through the return
   2218      * value of {@link #registerReceiver(BroadcastReceiver, IntentFilter)}.  In
   2219      * all other ways, this behaves the same as
   2220      * {@link #sendBroadcast(Intent)}.
   2221      *
   2222      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2223      * can access them), no protection (anyone can modify them), and many other problems.
   2224      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2225      * has changed, with another mechanism for apps to retrieve the current value whenever
   2226      * desired.
   2227      *
   2228      * @param intent The Intent to broadcast; all receivers matching this
   2229      * Intent will receive the broadcast, and the Intent will be held to
   2230      * be re-broadcast to future receivers.
   2231      *
   2232      * @see #sendBroadcast(Intent)
   2233      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
   2234      */
   2235     @Deprecated
   2236     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
   2237     public abstract void sendStickyBroadcast(@RequiresPermission Intent intent);
   2238 
   2239     /**
   2240      * <p>Version of {@link #sendStickyBroadcast} that allows you to
   2241      * receive data back from the broadcast.  This is accomplished by
   2242      * supplying your own BroadcastReceiver when calling, which will be
   2243      * treated as a final receiver at the end of the broadcast -- its
   2244      * {@link BroadcastReceiver#onReceive} method will be called with
   2245      * the result values collected from the other receivers.  The broadcast will
   2246      * be serialized in the same way as calling
   2247      * {@link #sendOrderedBroadcast(Intent, String)}.
   2248      *
   2249      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   2250      * asynchronous; it will return before
   2251      * resultReceiver.onReceive() is called.  Note that the sticky data
   2252      * stored is only the data you initially supply to the broadcast, not
   2253      * the result of any changes made by the receivers.
   2254      *
   2255      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2256      *
   2257      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2258      * can access them), no protection (anyone can modify them), and many other problems.
   2259      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2260      * has changed, with another mechanism for apps to retrieve the current value whenever
   2261      * desired.
   2262      *
   2263      * @param intent The Intent to broadcast; all receivers matching this
   2264      *               Intent will receive the broadcast.
   2265      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2266      *                       receiver of the broadcast.
   2267      * @param scheduler A custom Handler with which to schedule the
   2268      *                  resultReceiver callback; if null it will be
   2269      *                  scheduled in the Context's main thread.
   2270      * @param initialCode An initial value for the result code.  Often
   2271      *                    Activity.RESULT_OK.
   2272      * @param initialData An initial value for the result data.  Often
   2273      *                    null.
   2274      * @param initialExtras An initial value for the result extras.  Often
   2275      *                      null.
   2276      *
   2277      * @see #sendBroadcast(Intent)
   2278      * @see #sendBroadcast(Intent, String)
   2279      * @see #sendOrderedBroadcast(Intent, String)
   2280      * @see #sendStickyBroadcast(Intent)
   2281      * @see android.content.BroadcastReceiver
   2282      * @see #registerReceiver
   2283      * @see android.app.Activity#RESULT_OK
   2284      */
   2285     @Deprecated
   2286     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
   2287     public abstract void sendStickyOrderedBroadcast(@RequiresPermission Intent intent,
   2288             BroadcastReceiver resultReceiver,
   2289             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2290             @Nullable Bundle initialExtras);
   2291 
   2292     /**
   2293      * <p>Remove the data previously sent with {@link #sendStickyBroadcast},
   2294      * so that it is as if the sticky broadcast had never happened.
   2295      *
   2296      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2297      * can access them), no protection (anyone can modify them), and many other problems.
   2298      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2299      * has changed, with another mechanism for apps to retrieve the current value whenever
   2300      * desired.
   2301      *
   2302      * @param intent The Intent that was previously broadcast.
   2303      *
   2304      * @see #sendStickyBroadcast
   2305      */
   2306     @Deprecated
   2307     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
   2308     public abstract void removeStickyBroadcast(@RequiresPermission Intent intent);
   2309 
   2310     /**
   2311      * <p>Version of {@link #sendStickyBroadcast(Intent)} that allows you to specify the
   2312      * user the broadcast will be sent to.  This is not available to applications
   2313      * that are not pre-installed on the system image.
   2314      *
   2315      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2316      * can access them), no protection (anyone can modify them), and many other problems.
   2317      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2318      * has changed, with another mechanism for apps to retrieve the current value whenever
   2319      * desired.
   2320      *
   2321      * @param intent The Intent to broadcast; all receivers matching this
   2322      * Intent will receive the broadcast, and the Intent will be held to
   2323      * be re-broadcast to future receivers.
   2324      * @param user UserHandle to send the intent to.
   2325      *
   2326      * @see #sendBroadcast(Intent)
   2327      */
   2328     @Deprecated
   2329     @RequiresPermission(allOf = {
   2330             android.Manifest.permission.INTERACT_ACROSS_USERS,
   2331             android.Manifest.permission.BROADCAST_STICKY
   2332     })
   2333     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2334             UserHandle user);
   2335 
   2336     /**
   2337      * @hide
   2338      * This is just here for sending CONNECTIVITY_ACTION.
   2339      */
   2340     @Deprecated
   2341     @RequiresPermission(allOf = {
   2342             android.Manifest.permission.INTERACT_ACROSS_USERS,
   2343             android.Manifest.permission.BROADCAST_STICKY
   2344     })
   2345     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2346             UserHandle user, Bundle options);
   2347 
   2348     /**
   2349      * <p>Version of
   2350      * {@link #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)}
   2351      * that allows you to specify the
   2352      * user the broadcast will be sent to.  This is not available to applications
   2353      * that are not pre-installed on the system image.
   2354      *
   2355      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2356      *
   2357      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2358      * can access them), no protection (anyone can modify them), and many other problems.
   2359      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2360      * has changed, with another mechanism for apps to retrieve the current value whenever
   2361      * desired.
   2362      *
   2363      * @param intent The Intent to broadcast; all receivers matching this
   2364      *               Intent will receive the broadcast.
   2365      * @param user UserHandle to send the intent to.
   2366      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2367      *                       receiver of the broadcast.
   2368      * @param scheduler A custom Handler with which to schedule the
   2369      *                  resultReceiver callback; if null it will be
   2370      *                  scheduled in the Context's main thread.
   2371      * @param initialCode An initial value for the result code.  Often
   2372      *                    Activity.RESULT_OK.
   2373      * @param initialData An initial value for the result data.  Often
   2374      *                    null.
   2375      * @param initialExtras An initial value for the result extras.  Often
   2376      *                      null.
   2377      *
   2378      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
   2379      */
   2380     @Deprecated
   2381     @RequiresPermission(allOf = {
   2382             android.Manifest.permission.INTERACT_ACROSS_USERS,
   2383             android.Manifest.permission.BROADCAST_STICKY
   2384     })
   2385     public abstract void sendStickyOrderedBroadcastAsUser(@RequiresPermission Intent intent,
   2386             UserHandle user, BroadcastReceiver resultReceiver,
   2387             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2388             @Nullable Bundle initialExtras);
   2389 
   2390     /**
   2391      * <p>Version of {@link #removeStickyBroadcast(Intent)} that allows you to specify the
   2392      * user the broadcast will be sent to.  This is not available to applications
   2393      * that are not pre-installed on the system image.
   2394      *
   2395      * <p>You must hold the {@link android.Manifest.permission#BROADCAST_STICKY}
   2396      * permission in order to use this API.  If you do not hold that
   2397      * permission, {@link SecurityException} will be thrown.
   2398      *
   2399      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2400      * can access them), no protection (anyone can modify them), and many other problems.
   2401      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2402      * has changed, with another mechanism for apps to retrieve the current value whenever
   2403      * desired.
   2404      *
   2405      * @param intent The Intent that was previously broadcast.
   2406      * @param user UserHandle to remove the sticky broadcast from.
   2407      *
   2408      * @see #sendStickyBroadcastAsUser
   2409      */
   2410     @Deprecated
   2411     @RequiresPermission(allOf = {
   2412             android.Manifest.permission.INTERACT_ACROSS_USERS,
   2413             android.Manifest.permission.BROADCAST_STICKY
   2414     })
   2415     public abstract void removeStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2416             UserHandle user);
   2417 
   2418     /**
   2419      * Register a BroadcastReceiver to be run in the main activity thread.  The
   2420      * <var>receiver</var> will be called with any broadcast Intent that
   2421      * matches <var>filter</var>, in the main application thread.
   2422      *
   2423      * <p>The system may broadcast Intents that are "sticky" -- these stay
   2424      * around after the broadcast has finished, to be sent to any later
   2425      * registrations. If your IntentFilter matches one of these sticky
   2426      * Intents, that Intent will be returned by this function
   2427      * <strong>and</strong> sent to your <var>receiver</var> as if it had just
   2428      * been broadcast.
   2429      *
   2430      * <p>There may be multiple sticky Intents that match <var>filter</var>,
   2431      * in which case each of these will be sent to <var>receiver</var>.  In
   2432      * this case, only one of these can be returned directly by the function;
   2433      * which of these that is returned is arbitrarily decided by the system.
   2434      *
   2435      * <p>If you know the Intent your are registering for is sticky, you can
   2436      * supply null for your <var>receiver</var>.  In this case, no receiver is
   2437      * registered -- the function simply returns the sticky Intent that
   2438      * matches <var>filter</var>.  In the case of multiple matches, the same
   2439      * rules as described above apply.
   2440      *
   2441      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2442      *
   2443      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2444      * registered with this method will correctly respect the
   2445      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2446      * Prior to that, it would be ignored and delivered to all matching registered
   2447      * receivers.  Be careful if using this for security.</p>
   2448      *
   2449      * <p class="note">Note: this method <em>cannot be called from a
   2450      * {@link BroadcastReceiver} component;</em> that is, from a BroadcastReceiver
   2451      * that is declared in an application's manifest.  It is okay, however, to call
   2452      * this method from another BroadcastReceiver that has itself been registered
   2453      * at run time with {@link #registerReceiver}, since the lifetime of such a
   2454      * registered BroadcastReceiver is tied to the object that registered it.</p>
   2455      *
   2456      * @param receiver The BroadcastReceiver to handle the broadcast.
   2457      * @param filter Selects the Intent broadcasts to be received.
   2458      *
   2459      * @return The first sticky intent found that matches <var>filter</var>,
   2460      *         or null if there are none.
   2461      *
   2462      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2463      * @see #sendBroadcast
   2464      * @see #unregisterReceiver
   2465      */
   2466     @Nullable
   2467     public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
   2468                                             IntentFilter filter);
   2469 
   2470     /**
   2471      * Register to receive intent broadcasts, with the receiver optionally being
   2472      * exposed to Instant Apps. See
   2473      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
   2474      * information. By default Instant Apps cannot interact with receivers in other
   2475      * applications, this allows you to expose a receiver that Instant Apps can
   2476      * interact with.
   2477      *
   2478      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2479      *
   2480      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2481      * registered with this method will correctly respect the
   2482      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2483      * Prior to that, it would be ignored and delivered to all matching registered
   2484      * receivers.  Be careful if using this for security.</p>
   2485      *
   2486      * @param receiver The BroadcastReceiver to handle the broadcast.
   2487      * @param filter Selects the Intent broadcasts to be received.
   2488      * @param flags Additional options for the receiver. May be 0 or
   2489      *      {@link #RECEIVER_VISIBLE_TO_INSTANT_APPS}.
   2490      *
   2491      * @return The first sticky intent found that matches <var>filter</var>,
   2492      *         or null if there are none.
   2493      *
   2494      * @see #registerReceiver(BroadcastReceiver, IntentFilter)
   2495      * @see #sendBroadcast
   2496      * @see #unregisterReceiver
   2497      */
   2498     @Nullable
   2499     public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
   2500                                             IntentFilter filter,
   2501                                             @RegisterReceiverFlags int flags);
   2502 
   2503     /**
   2504      * Register to receive intent broadcasts, to run in the context of
   2505      * <var>scheduler</var>.  See
   2506      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
   2507      * information.  This allows you to enforce permissions on who can
   2508      * broadcast intents to your receiver, or have the receiver run in
   2509      * a different thread than the main application thread.
   2510      *
   2511      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2512      *
   2513      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2514      * registered with this method will correctly respect the
   2515      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2516      * Prior to that, it would be ignored and delivered to all matching registered
   2517      * receivers.  Be careful if using this for security.</p>
   2518      *
   2519      * @param receiver The BroadcastReceiver to handle the broadcast.
   2520      * @param filter Selects the Intent broadcasts to be received.
   2521      * @param broadcastPermission String naming a permissions that a
   2522      *      broadcaster must hold in order to send an Intent to you.  If null,
   2523      *      no permission is required.
   2524      * @param scheduler Handler identifying the thread that will receive
   2525      *      the Intent.  If null, the main thread of the process will be used.
   2526      *
   2527      * @return The first sticky intent found that matches <var>filter</var>,
   2528      *         or null if there are none.
   2529      *
   2530      * @see #registerReceiver(BroadcastReceiver, IntentFilter)
   2531      * @see #sendBroadcast
   2532      * @see #unregisterReceiver
   2533      */
   2534     @Nullable
   2535     public abstract Intent registerReceiver(BroadcastReceiver receiver,
   2536             IntentFilter filter, @Nullable String broadcastPermission,
   2537             @Nullable Handler scheduler);
   2538 
   2539     /**
   2540      * Register to receive intent broadcasts, to run in the context of
   2541      * <var>scheduler</var>. See
   2542      * {@link #registerReceiver(BroadcastReceiver, IntentFilter, int)} and
   2543      * {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)}
   2544      * for more information.
   2545      *
   2546      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2547      *
   2548      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2549      * registered with this method will correctly respect the
   2550      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2551      * Prior to that, it would be ignored and delivered to all matching registered
   2552      * receivers.  Be careful if using this for security.</p>
   2553      *
   2554      * @param receiver The BroadcastReceiver to handle the broadcast.
   2555      * @param filter Selects the Intent broadcasts to be received.
   2556      * @param broadcastPermission String naming a permissions that a
   2557      *      broadcaster must hold in order to send an Intent to you.  If null,
   2558      *      no permission is required.
   2559      * @param scheduler Handler identifying the thread that will receive
   2560      *      the Intent.  If null, the main thread of the process will be used.
   2561      * @param flags Additional options for the receiver. May be 0 or
   2562      *      {@link #RECEIVER_VISIBLE_TO_INSTANT_APPS}.
   2563      *
   2564      * @return The first sticky intent found that matches <var>filter</var>,
   2565      *         or null if there are none.
   2566      *
   2567      * @see #registerReceiver(BroadcastReceiver, IntentFilter, int)
   2568      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2569      * @see #sendBroadcast
   2570      * @see #unregisterReceiver
   2571      */
   2572     @Nullable
   2573     public abstract Intent registerReceiver(BroadcastReceiver receiver,
   2574             IntentFilter filter, @Nullable String broadcastPermission,
   2575             @Nullable Handler scheduler, @RegisterReceiverFlags int flags);
   2576 
   2577     /**
   2578      * @hide
   2579      * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2580      * but for a specific user.  This receiver will receiver broadcasts that
   2581      * are sent to the requested user.
   2582      *
   2583      * @param receiver The BroadcastReceiver to handle the broadcast.
   2584      * @param user UserHandle to send the intent to.
   2585      * @param filter Selects the Intent broadcasts to be received.
   2586      * @param broadcastPermission String naming a permissions that a
   2587      *      broadcaster must hold in order to send an Intent to you.  If null,
   2588      *      no permission is required.
   2589      * @param scheduler Handler identifying the thread that will receive
   2590      *      the Intent.  If null, the main thread of the process will be used.
   2591      *
   2592      * @return The first sticky intent found that matches <var>filter</var>,
   2593      *         or null if there are none.
   2594      *
   2595      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2596      * @see #sendBroadcast
   2597      * @see #unregisterReceiver
   2598      */
   2599     @Nullable
   2600     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
   2601     public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver,
   2602             UserHandle user, IntentFilter filter, @Nullable String broadcastPermission,
   2603             @Nullable Handler scheduler);
   2604 
   2605     /**
   2606      * Unregister a previously registered BroadcastReceiver.  <em>All</em>
   2607      * filters that have been registered for this BroadcastReceiver will be
   2608      * removed.
   2609      *
   2610      * @param receiver The BroadcastReceiver to unregister.
   2611      *
   2612      * @see #registerReceiver
   2613      */
   2614     public abstract void unregisterReceiver(BroadcastReceiver receiver);
   2615 
   2616     /**
   2617      * Request that a given application service be started.  The Intent
   2618      * should either contain the complete class name of a specific service
   2619      * implementation to start, or a specific package name to target.  If the
   2620      * Intent is less specified, it logs a warning about this.  In this case any of the
   2621      * multiple matching services may be used.  If this service
   2622      * is not already running, it will be instantiated and started (creating a
   2623      * process for it if needed); if it is running then it remains running.
   2624      *
   2625      * <p>Every call to this method will result in a corresponding call to
   2626      * the target service's {@link android.app.Service#onStartCommand} method,
   2627      * with the <var>intent</var> given here.  This provides a convenient way
   2628      * to submit jobs to a service without having to bind and call on to its
   2629      * interface.
   2630      *
   2631      * <p>Using startService() overrides the default service lifetime that is
   2632      * managed by {@link #bindService}: it requires the service to remain
   2633      * running until {@link #stopService} is called, regardless of whether
   2634      * any clients are connected to it.  Note that calls to startService()
   2635      * do not nest: no matter how many times you call startService(),
   2636      * a single call to {@link #stopService} will stop it.
   2637      *
   2638      * <p>The system attempts to keep running services around as much as
   2639      * possible.  The only time they should be stopped is if the current
   2640      * foreground application is using so many resources that the service needs
   2641      * to be killed.  If any errors happen in the service's process, it will
   2642      * automatically be restarted.
   2643      *
   2644      * <p>This function will throw {@link SecurityException} if you do not
   2645      * have permission to start the given service.
   2646      *
   2647      * <p class="note"><strong>Note:</strong> Each call to startService()
   2648      * results in significant work done by the system to manage service
   2649      * lifecycle surrounding the processing of the intent, which can take
   2650      * multiple milliseconds of CPU time. Due to this cost, startService()
   2651      * should not be used for frequent intent delivery to a service, and only
   2652      * for scheduling significant work. Use {@link #bindService bound services}
   2653      * for high frequency calls.
   2654      * </p>
   2655      *
   2656      * @param service Identifies the service to be started.  The Intent must be
   2657      *      fully explicit (supplying a component name).  Additional values
   2658      *      may be included in the Intent extras to supply arguments along with
   2659      *      this specific start call.
   2660      *
   2661      * @return If the service is being started or is already running, the
   2662      * {@link ComponentName} of the actual service that was started is
   2663      * returned; else if the service does not exist null is returned.
   2664      *
   2665      * @throws SecurityException If the caller does not have permission to access the service
   2666      * or the service can not be found.
   2667      * @throws IllegalStateException If the application is in a state where the service
   2668      * can not be started (such as not in the foreground in a state when services are allowed).
   2669      *
   2670      * @see #stopService
   2671      * @see #bindService
   2672      */
   2673     @Nullable
   2674     public abstract ComponentName startService(Intent service);
   2675 
   2676     /**
   2677      * Similar to {@link #startService(Intent)}, but with an implicit promise that the
   2678      * Service will call {@link android.app.Service#startForeground(int, Notification)
   2679      * startForeground(int, Notification)} once it begins running.  The service is given
   2680      * an amount of time comparable to the ANR interval to do this, otherwise the system
   2681      * will automatically stop the service and declare the app ANR.
   2682      *
   2683      * <p>Unlike the ordinary {@link #startService(Intent)}, this method can be used
   2684      * at any time, regardless of whether the app hosting the service is in a foreground
   2685      * state.
   2686      *
   2687      * @param service Identifies the service to be started.  The Intent must be
   2688      *      fully explicit (supplying a component name).  Additional values
   2689      *      may be included in the Intent extras to supply arguments along with
   2690      *      this specific start call.
   2691      *
   2692      * @return If the service is being started or is already running, the
   2693      * {@link ComponentName} of the actual service that was started is
   2694      * returned; else if the service does not exist null is returned.
   2695      *
   2696      * @throws SecurityException If the caller does not have permission to access the service
   2697      * or the service can not be found.
   2698      *
   2699      * @see #stopService
   2700      * @see android.app.Service#startForeground(int, Notification)
   2701      */
   2702     @Nullable
   2703     public abstract ComponentName startForegroundService(Intent service);
   2704 
   2705     /**
   2706      * @hide like {@link #startForegroundService(Intent)} but for a specific user.
   2707      */
   2708     @Nullable
   2709     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2710     public abstract ComponentName startForegroundServiceAsUser(Intent service, UserHandle user);
   2711 
   2712     /**
   2713      * Request that a given application service be stopped.  If the service is
   2714      * not running, nothing happens.  Otherwise it is stopped.  Note that calls
   2715      * to startService() are not counted -- this stops the service no matter
   2716      * how many times it was started.
   2717      *
   2718      * <p>Note that if a stopped service still has {@link ServiceConnection}
   2719      * objects bound to it with the {@link #BIND_AUTO_CREATE} set, it will
   2720      * not be destroyed until all of these bindings are removed.  See
   2721      * the {@link android.app.Service} documentation for more details on a
   2722      * service's lifecycle.
   2723      *
   2724      * <p>This function will throw {@link SecurityException} if you do not
   2725      * have permission to stop the given service.
   2726      *
   2727      * @param service Description of the service to be stopped.  The Intent must be either
   2728      *      fully explicit (supplying a component name) or specify a specific package
   2729      *      name it is targetted to.
   2730      *
   2731      * @return If there is a service matching the given Intent that is already
   2732      * running, then it is stopped and {@code true} is returned; else {@code false} is returned.
   2733      *
   2734      * @throws SecurityException If the caller does not have permission to access the service
   2735      * or the service can not be found.
   2736      * @throws IllegalStateException If the application is in a state where the service
   2737      * can not be started (such as not in the foreground in a state when services are allowed).
   2738      *
   2739      * @see #startService
   2740      */
   2741     public abstract boolean stopService(Intent service);
   2742 
   2743     /**
   2744      * @hide like {@link #startService(Intent)} but for a specific user.
   2745      */
   2746     @Nullable
   2747     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2748     public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);
   2749 
   2750     /**
   2751      * @hide like {@link #stopService(Intent)} but for a specific user.
   2752      */
   2753     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2754     public abstract boolean stopServiceAsUser(Intent service, UserHandle user);
   2755 
   2756     /**
   2757      * Connect to an application service, creating it if needed.  This defines
   2758      * a dependency between your application and the service.  The given
   2759      * <var>conn</var> will receive the service object when it is created and be
   2760      * told if it dies and restarts.  The service will be considered required
   2761      * by the system only for as long as the calling context exists.  For
   2762      * example, if this Context is an Activity that is stopped, the service will
   2763      * not be required to continue running until the Activity is resumed.
   2764      *
   2765      * <p>This function will throw {@link SecurityException} if you do not
   2766      * have permission to bind to the given service.
   2767      *
   2768      * <p class="note">Note: this method <em>can not be called from a
   2769      * {@link BroadcastReceiver} component</em>.  A pattern you can use to
   2770      * communicate from a BroadcastReceiver to a Service is to call
   2771      * {@link #startService} with the arguments containing the command to be
   2772      * sent, with the service calling its
   2773      * {@link android.app.Service#stopSelf(int)} method when done executing
   2774      * that command.  See the API demo App/Service/Service Start Arguments
   2775      * Controller for an illustration of this.  It is okay, however, to use
   2776      * this method from a BroadcastReceiver that has been registered with
   2777      * {@link #registerReceiver}, since the lifetime of this BroadcastReceiver
   2778      * is tied to another object (the one that registered it).</p>
   2779      *
   2780      * @param service Identifies the service to connect to.  The Intent must
   2781      *      specify an explicit component name.
   2782      * @param conn Receives information as the service is started and stopped.
   2783      *      This must be a valid ServiceConnection object; it must not be null.
   2784      * @param flags Operation options for the binding.  May be 0,
   2785      *          {@link #BIND_AUTO_CREATE}, {@link #BIND_DEBUG_UNBIND},
   2786      *          {@link #BIND_NOT_FOREGROUND}, {@link #BIND_ABOVE_CLIENT},
   2787      *          {@link #BIND_ALLOW_OOM_MANAGEMENT}, or
   2788      *          {@link #BIND_WAIVE_PRIORITY}.
   2789      * @return If you have successfully bound to the service, {@code true} is returned;
   2790      *         {@code false} is returned if the connection is not made so you will not
   2791      *         receive the service object. However, you should still call
   2792      *         {@link #unbindService} to release the connection.
   2793      *
   2794      * @throws SecurityException If the caller does not have permission to access the service
   2795      * or the service can not be found.
   2796      *
   2797      * @see #unbindService
   2798      * @see #startService
   2799      * @see #BIND_AUTO_CREATE
   2800      * @see #BIND_DEBUG_UNBIND
   2801      * @see #BIND_NOT_FOREGROUND
   2802      */
   2803     public abstract boolean bindService(@RequiresPermission Intent service,
   2804             @NonNull ServiceConnection conn, @BindServiceFlags int flags);
   2805 
   2806     /**
   2807      * Same as {@link #bindService(Intent, ServiceConnection, int)}, but with an explicit userHandle
   2808      * argument for use by system server and other multi-user aware code.
   2809      * @hide
   2810      */
   2811     @SystemApi
   2812     @SuppressWarnings("unused")
   2813     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2814     public boolean bindServiceAsUser(@RequiresPermission Intent service, ServiceConnection conn,
   2815             int flags, UserHandle user) {
   2816         throw new RuntimeException("Not implemented. Must override in a subclass.");
   2817     }
   2818 
   2819     /**
   2820      * Same as {@link #bindService(Intent, ServiceConnection, int, UserHandle)}, but with an
   2821      * explicit non-null Handler to run the ServiceConnection callbacks on.
   2822      *
   2823      * @hide
   2824      */
   2825     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
   2826     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
   2827             Handler handler, UserHandle user) {
   2828         throw new RuntimeException("Not implemented. Must override in a subclass.");
   2829     }
   2830 
   2831     /**
   2832      * Disconnect from an application service.  You will no longer receive
   2833      * calls as the service is restarted, and the service is now allowed to
   2834      * stop at any time.
   2835      *
   2836      * @param conn The connection interface previously supplied to
   2837      *             bindService().  This parameter must not be null.
   2838      *
   2839      * @see #bindService
   2840      */
   2841     public abstract void unbindService(@NonNull ServiceConnection conn);
   2842 
   2843     /**
   2844      * Start executing an {@link android.app.Instrumentation} class.  The given
   2845      * Instrumentation component will be run by killing its target application
   2846      * (if currently running), starting the target process, instantiating the
   2847      * instrumentation component, and then letting it drive the application.
   2848      *
   2849      * <p>This function is not synchronous -- it returns as soon as the
   2850      * instrumentation has started and while it is running.
   2851      *
   2852      * <p>Instrumentation is normally only allowed to run against a package
   2853      * that is either unsigned or signed with a signature that the
   2854      * the instrumentation package is also signed with (ensuring the target
   2855      * trusts the instrumentation).
   2856      *
   2857      * @param className Name of the Instrumentation component to be run.
   2858      * @param profileFile Optional path to write profiling data as the
   2859      * instrumentation runs, or null for no profiling.
   2860      * @param arguments Additional optional arguments to pass to the
   2861      * instrumentation, or null.
   2862      *
   2863      * @return {@code true} if the instrumentation was successfully started,
   2864      * else {@code false} if it could not be found.
   2865      */
   2866     public abstract boolean startInstrumentation(@NonNull ComponentName className,
   2867             @Nullable String profileFile, @Nullable Bundle arguments);
   2868 
   2869     /** @hide */
   2870     @StringDef({
   2871             POWER_SERVICE,
   2872             WINDOW_SERVICE,
   2873             LAYOUT_INFLATER_SERVICE,
   2874             ACCOUNT_SERVICE,
   2875             ACTIVITY_SERVICE,
   2876             ALARM_SERVICE,
   2877             NOTIFICATION_SERVICE,
   2878             ACCESSIBILITY_SERVICE,
   2879             CAPTIONING_SERVICE,
   2880             KEYGUARD_SERVICE,
   2881             LOCATION_SERVICE,
   2882             //@hide: COUNTRY_DETECTOR,
   2883             SEARCH_SERVICE,
   2884             SENSOR_SERVICE,
   2885             STORAGE_SERVICE,
   2886             STORAGE_STATS_SERVICE,
   2887             WALLPAPER_SERVICE,
   2888             VIBRATOR_SERVICE,
   2889             //@hide: STATUS_BAR_SERVICE,
   2890             CONNECTIVITY_SERVICE,
   2891             IPSEC_SERVICE,
   2892             //@hide: UPDATE_LOCK_SERVICE,
   2893             //@hide: NETWORKMANAGEMENT_SERVICE,
   2894             NETWORK_STATS_SERVICE,
   2895             //@hide: NETWORK_POLICY_SERVICE,
   2896             WIFI_SERVICE,
   2897             WIFI_AWARE_SERVICE,
   2898             WIFI_P2P_SERVICE,
   2899             WIFI_SCANNING_SERVICE,
   2900             //@hide: WIFI_RTT_SERVICE,
   2901             //@hide: ETHERNET_SERVICE,
   2902             WIFI_RTT_SERVICE,
   2903             NSD_SERVICE,
   2904             AUDIO_SERVICE,
   2905             FINGERPRINT_SERVICE,
   2906             MEDIA_ROUTER_SERVICE,
   2907             TELEPHONY_SERVICE,
   2908             TELEPHONY_SUBSCRIPTION_SERVICE,
   2909             CARRIER_CONFIG_SERVICE,
   2910             TELECOM_SERVICE,
   2911             CLIPBOARD_SERVICE,
   2912             INPUT_METHOD_SERVICE,
   2913             TEXT_SERVICES_MANAGER_SERVICE,
   2914             TEXT_CLASSIFICATION_SERVICE,
   2915             APPWIDGET_SERVICE,
   2916             //@hide: VOICE_INTERACTION_MANAGER_SERVICE,
   2917             //@hide: BACKUP_SERVICE,
   2918             DROPBOX_SERVICE,
   2919             //@hide: DEVICE_IDLE_CONTROLLER,
   2920             DEVICE_POLICY_SERVICE,
   2921             UI_MODE_SERVICE,
   2922             DOWNLOAD_SERVICE,
   2923             NFC_SERVICE,
   2924             BLUETOOTH_SERVICE,
   2925             //@hide: SIP_SERVICE,
   2926             USB_SERVICE,
   2927             LAUNCHER_APPS_SERVICE,
   2928             //@hide: SERIAL_SERVICE,
   2929             //@hide: HDMI_CONTROL_SERVICE,
   2930             INPUT_SERVICE,
   2931             DISPLAY_SERVICE,
   2932             USER_SERVICE,
   2933             RESTRICTIONS_SERVICE,
   2934             APP_OPS_SERVICE,
   2935             CAMERA_SERVICE,
   2936             PRINT_SERVICE,
   2937             CONSUMER_IR_SERVICE,
   2938             //@hide: TRUST_SERVICE,
   2939             TV_INPUT_SERVICE,
   2940             //@hide: NETWORK_SCORE_SERVICE,
   2941             USAGE_STATS_SERVICE,
   2942             MEDIA_SESSION_SERVICE,
   2943             BATTERY_SERVICE,
   2944             JOB_SCHEDULER_SERVICE,
   2945             //@hide: PERSISTENT_DATA_BLOCK_SERVICE,
   2946             //@hide: OEM_LOCK_SERVICE,
   2947             MEDIA_PROJECTION_SERVICE,
   2948             MIDI_SERVICE,
   2949             RADIO_SERVICE,
   2950             HARDWARE_PROPERTIES_SERVICE,
   2951             //@hide: SOUND_TRIGGER_SERVICE,
   2952             SHORTCUT_SERVICE,
   2953             //@hide: CONTEXTHUB_SERVICE,
   2954             SYSTEM_HEALTH_SERVICE,
   2955             //@hide: INCIDENT_SERVICE
   2956     })
   2957     @Retention(RetentionPolicy.SOURCE)
   2958     public @interface ServiceName {}
   2959 
   2960     /**
   2961      * Return the handle to a system-level service by name. The class of the
   2962      * returned object varies by the requested name. Currently available names
   2963      * are:
   2964      *
   2965      * <dl>
   2966      *  <dt> {@link #WINDOW_SERVICE} ("window")
   2967      *  <dd> The top-level window manager in which you can place custom
   2968      *  windows.  The returned object is a {@link android.view.WindowManager}.
   2969      *  <dt> {@link #LAYOUT_INFLATER_SERVICE} ("layout_inflater")
   2970      *  <dd> A {@link android.view.LayoutInflater} for inflating layout resources
   2971      *  in this context.
   2972      *  <dt> {@link #ACTIVITY_SERVICE} ("activity")
   2973      *  <dd> A {@link android.app.ActivityManager} for interacting with the
   2974      *  global activity state of the system.
   2975      *  <dt> {@link #POWER_SERVICE} ("power")
   2976      *  <dd> A {@link android.os.PowerManager} for controlling power
   2977      *  management.
   2978      *  <dt> {@link #ALARM_SERVICE} ("alarm")
   2979      *  <dd> A {@link android.app.AlarmManager} for receiving intents at the
   2980      *  time of your choosing.
   2981      *  <dt> {@link #NOTIFICATION_SERVICE} ("notification")
   2982      *  <dd> A {@link android.app.NotificationManager} for informing the user
   2983      *   of background events.
   2984      *  <dt> {@link #KEYGUARD_SERVICE} ("keyguard")
   2985      *  <dd> A {@link android.app.KeyguardManager} for controlling keyguard.
   2986      *  <dt> {@link #LOCATION_SERVICE} ("location")
   2987      *  <dd> A {@link android.location.LocationManager} for controlling location
   2988      *   (e.g., GPS) updates.
   2989      *  <dt> {@link #SEARCH_SERVICE} ("search")
   2990      *  <dd> A {@link android.app.SearchManager} for handling search.
   2991      *  <dt> {@link #VIBRATOR_SERVICE} ("vibrator")
   2992      *  <dd> A {@link android.os.Vibrator} for interacting with the vibrator
   2993      *  hardware.
   2994      *  <dt> {@link #CONNECTIVITY_SERVICE} ("connection")
   2995      *  <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for
   2996      *  handling management of network connections.
   2997      *  <dt> {@link #WIFI_SERVICE} ("wifi")
   2998      *  <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi
   2999      *  connectivity.  On releases before NYC, it should only be obtained from an application
   3000      *  context, and not from any other derived context to avoid memory leaks within the calling
   3001      *  process.
   3002      *  <dt> {@link #WIFI_AWARE_SERVICE} ("wifiaware")
   3003      *  <dd> A {@link android.net.wifi.aware.WifiAwareManager WifiAwareManager} for management of
   3004      * Wi-Fi Aware discovery and connectivity.
   3005      *  <dt> {@link #WIFI_P2P_SERVICE} ("wifip2p")
   3006      *  <dd> A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of
   3007      * Wi-Fi Direct connectivity.
   3008      * <dt> {@link #INPUT_METHOD_SERVICE} ("input_method")
   3009      * <dd> An {@link android.view.inputmethod.InputMethodManager InputMethodManager}
   3010      * for management of input methods.
   3011      * <dt> {@link #UI_MODE_SERVICE} ("uimode")
   3012      * <dd> An {@link android.app.UiModeManager} for controlling UI modes.
   3013      * <dt> {@link #DOWNLOAD_SERVICE} ("download")
   3014      * <dd> A {@link android.app.DownloadManager} for requesting HTTP downloads
   3015      * <dt> {@link #BATTERY_SERVICE} ("batterymanager")
   3016      * <dd> A {@link android.os.BatteryManager} for managing battery state
   3017      * <dt> {@link #JOB_SCHEDULER_SERVICE} ("taskmanager")
   3018      * <dd>  A {@link android.app.job.JobScheduler} for managing scheduled tasks
   3019      * <dt> {@link #NETWORK_STATS_SERVICE} ("netstats")
   3020      * <dd> A {@link android.app.usage.NetworkStatsManager NetworkStatsManager} for querying network
   3021      * usage statistics.
   3022      * <dt> {@link #HARDWARE_PROPERTIES_SERVICE} ("hardware_properties")
   3023      * <dd> A {@link android.os.HardwarePropertiesManager} for accessing hardware properties.
   3024      * </dl>
   3025      *
   3026      * <p>Note:  System services obtained via this API may be closely associated with
   3027      * the Context in which they are obtained from.  In general, do not share the
   3028      * service objects between various different contexts (Activities, Applications,
   3029      * Services, Providers, etc.)
   3030      *
   3031      * @param name The name of the desired service.
   3032      *
   3033      * @return The service or null if the name does not exist.
   3034      *
   3035      * @see #WINDOW_SERVICE
   3036      * @see android.view.WindowManager
   3037      * @see #LAYOUT_INFLATER_SERVICE
   3038      * @see android.view.LayoutInflater
   3039      * @see #ACTIVITY_SERVICE
   3040      * @see android.app.ActivityManager
   3041      * @see #POWER_SERVICE
   3042      * @see android.os.PowerManager
   3043      * @see #ALARM_SERVICE
   3044      * @see android.app.AlarmManager
   3045      * @see #NOTIFICATION_SERVICE
   3046      * @see android.app.NotificationManager
   3047      * @see #KEYGUARD_SERVICE
   3048      * @see android.app.KeyguardManager
   3049      * @see #LOCATION_SERVICE
   3050      * @see android.location.LocationManager
   3051      * @see #SEARCH_SERVICE
   3052      * @see android.app.SearchManager
   3053      * @see #SENSOR_SERVICE
   3054      * @see android.hardware.SensorManager
   3055      * @see #STORAGE_SERVICE
   3056      * @see android.os.storage.StorageManager
   3057      * @see #VIBRATOR_SERVICE
   3058      * @see android.os.Vibrator
   3059      * @see #CONNECTIVITY_SERVICE
   3060      * @see android.net.ConnectivityManager
   3061      * @see #WIFI_SERVICE
   3062      * @see android.net.wifi.WifiManager
   3063      * @see #AUDIO_SERVICE
   3064      * @see android.media.AudioManager
   3065      * @see #MEDIA_ROUTER_SERVICE
   3066      * @see android.media.MediaRouter
   3067      * @see #TELEPHONY_SERVICE
   3068      * @see android.telephony.TelephonyManager
   3069      * @see #TELEPHONY_SUBSCRIPTION_SERVICE
   3070      * @see android.telephony.SubscriptionManager
   3071      * @see #CARRIER_CONFIG_SERVICE
   3072      * @see android.telephony.CarrierConfigManager
   3073      * @see #INPUT_METHOD_SERVICE
   3074      * @see android.view.inputmethod.InputMethodManager
   3075      * @see #UI_MODE_SERVICE
   3076      * @see android.app.UiModeManager
   3077      * @see #DOWNLOAD_SERVICE
   3078      * @see android.app.DownloadManager
   3079      * @see #BATTERY_SERVICE
   3080      * @see android.os.BatteryManager
   3081      * @see #JOB_SCHEDULER_SERVICE
   3082      * @see android.app.job.JobScheduler
   3083      * @see #NETWORK_STATS_SERVICE
   3084      * @see android.app.usage.NetworkStatsManager
   3085      * @see android.os.HardwarePropertiesManager
   3086      * @see #HARDWARE_PROPERTIES_SERVICE
   3087      */
   3088     public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name);
   3089 
   3090     /**
   3091      * Return the handle to a system-level service by class.
   3092      * <p>
   3093      * Currently available classes are:
   3094      * {@link android.view.WindowManager}, {@link android.view.LayoutInflater},
   3095      * {@link android.app.ActivityManager}, {@link android.os.PowerManager},
   3096      * {@link android.app.AlarmManager}, {@link android.app.NotificationManager},
   3097      * {@link android.app.KeyguardManager}, {@link android.location.LocationManager},
   3098      * {@link android.app.SearchManager}, {@link android.os.Vibrator},
   3099      * {@link android.net.ConnectivityManager},
   3100      * {@link android.net.wifi.WifiManager},
   3101      * {@link android.media.AudioManager}, {@link android.media.MediaRouter},
   3102      * {@link android.telephony.TelephonyManager}, {@link android.telephony.SubscriptionManager},
   3103      * {@link android.view.inputmethod.InputMethodManager},
   3104      * {@link android.app.UiModeManager}, {@link android.app.DownloadManager},
   3105      * {@link android.os.BatteryManager}, {@link android.app.job.JobScheduler},
   3106      * {@link android.app.usage.NetworkStatsManager}.
   3107      * </p><p>
   3108      * Note: System services obtained via this API may be closely associated with
   3109      * the Context in which they are obtained from.  In general, do not share the
   3110      * service objects between various different contexts (Activities, Applications,
   3111      * Services, Providers, etc.)
   3112      * </p>
   3113      *
   3114      * @param serviceClass The class of the desired service.
   3115      * @return The service or null if the class is not a supported system service.
   3116      */
   3117     @SuppressWarnings("unchecked")
   3118     public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) {
   3119         // Because subclasses may override getSystemService(String) we cannot
   3120         // perform a lookup by class alone.  We must first map the class to its
   3121         // service name then invoke the string-based method.
   3122         String serviceName = getSystemServiceName(serviceClass);
   3123         return serviceName != null ? (T)getSystemService(serviceName) : null;
   3124     }
   3125 
   3126     /**
   3127      * Gets the name of the system-level service that is represented by the specified class.
   3128      *
   3129      * @param serviceClass The class of the desired service.
   3130      * @return The service name or null if the class is not a supported system service.
   3131      */
   3132     public abstract @Nullable String getSystemServiceName(@NonNull Class<?> serviceClass);
   3133 
   3134     /**
   3135      * Use with {@link #getSystemService} to retrieve a
   3136      * {@link android.os.PowerManager} for controlling power management,
   3137      * including "wake locks," which let you keep the device on while
   3138      * you're running long tasks.
   3139      */
   3140     public static final String POWER_SERVICE = "power";
   3141 
   3142     /**
   3143      * Use with {@link #getSystemService} to retrieve a
   3144      * {@link android.os.RecoverySystem} for accessing the recovery system
   3145      * service.
   3146      *
   3147      * @see #getSystemService
   3148      * @hide
   3149      */
   3150     public static final String RECOVERY_SERVICE = "recovery";
   3151 
   3152     /**
   3153      * Use with {@link #getSystemService} to retrieve a
   3154      * {@link android.view.WindowManager} for accessing the system's window
   3155      * manager.
   3156      *
   3157      * @see #getSystemService
   3158      * @see android.view.WindowManager
   3159      */
   3160     public static final String WINDOW_SERVICE = "window";
   3161 
   3162     /**
   3163      * Use with {@link #getSystemService} to retrieve a
   3164      * {@link android.view.LayoutInflater} for inflating layout resources in this
   3165      * context.
   3166      *
   3167      * @see #getSystemService
   3168      * @see android.view.LayoutInflater
   3169      */
   3170     public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
   3171 
   3172     /**
   3173      * Use with {@link #getSystemService} to retrieve a
   3174      * {@link android.accounts.AccountManager} for receiving intents at a
   3175      * time of your choosing.
   3176      *
   3177      * @see #getSystemService
   3178      * @see android.accounts.AccountManager
   3179      */
   3180     public static final String ACCOUNT_SERVICE = "account";
   3181 
   3182     /**
   3183      * Use with {@link #getSystemService} to retrieve a
   3184      * {@link android.app.ActivityManager} for interacting with the global
   3185      * system state.
   3186      *
   3187      * @see #getSystemService
   3188      * @see android.app.ActivityManager
   3189      */
   3190     public static final String ACTIVITY_SERVICE = "activity";
   3191 
   3192     /**
   3193      * Use with {@link #getSystemService} to retrieve a
   3194      * {@link android.app.AlarmManager} for receiving intents at a
   3195      * time of your choosing.
   3196      *
   3197      * @see #getSystemService
   3198      * @see android.app.AlarmManager
   3199      */
   3200     public static final String ALARM_SERVICE = "alarm";
   3201 
   3202     /**
   3203      * Use with {@link #getSystemService} to retrieve a
   3204      * {@link android.app.NotificationManager} for informing the user of
   3205      * background events.
   3206      *
   3207      * @see #getSystemService
   3208      * @see android.app.NotificationManager
   3209      */
   3210     public static final String NOTIFICATION_SERVICE = "notification";
   3211 
   3212     /**
   3213      * Use with {@link #getSystemService} to retrieve a
   3214      * {@link android.view.accessibility.AccessibilityManager} for giving the user
   3215      * feedback for UI events through the registered event listeners.
   3216      *
   3217      * @see #getSystemService
   3218      * @see android.view.accessibility.AccessibilityManager
   3219      */
   3220     public static final String ACCESSIBILITY_SERVICE = "accessibility";
   3221 
   3222     /**
   3223      * Use with {@link #getSystemService} to retrieve a
   3224      * {@link android.view.accessibility.CaptioningManager} for obtaining
   3225      * captioning properties and listening for changes in captioning
   3226      * preferences.
   3227      *
   3228      * @see #getSystemService
   3229      * @see android.view.accessibility.CaptioningManager
   3230      */
   3231     public static final String CAPTIONING_SERVICE = "captioning";
   3232 
   3233     /**
   3234      * Use with {@link #getSystemService} to retrieve a
   3235      * {@link android.app.NotificationManager} for controlling keyguard.
   3236      *
   3237      * @see #getSystemService
   3238      * @see android.app.KeyguardManager
   3239      */
   3240     public static final String KEYGUARD_SERVICE = "keyguard";
   3241 
   3242     /**
   3243      * Use with {@link #getSystemService} to retrieve a {@link
   3244      * android.location.LocationManager} for controlling location
   3245      * updates.
   3246      *
   3247      * @see #getSystemService
   3248      * @see android.location.LocationManager
   3249      */
   3250     public static final String LOCATION_SERVICE = "location";
   3251 
   3252     /**
   3253      * Use with {@link #getSystemService} to retrieve a
   3254      * {@link android.location.CountryDetector} for detecting the country that
   3255      * the user is in.
   3256      *
   3257      * @hide
   3258      */
   3259     public static final String COUNTRY_DETECTOR = "country_detector";
   3260 
   3261     /**
   3262      * Use with {@link #getSystemService} to retrieve a {@link
   3263      * android.app.SearchManager} for handling searches.
   3264      *
   3265      * @see #getSystemService
   3266      * @see android.app.SearchManager
   3267      */
   3268     public static final String SEARCH_SERVICE = "search";
   3269 
   3270     /**
   3271      * Use with {@link #getSystemService} to retrieve a {@link
   3272      * android.hardware.SensorManager} for accessing sensors.
   3273      *
   3274      * @see #getSystemService
   3275      * @see android.hardware.SensorManager
   3276      */
   3277     public static final String SENSOR_SERVICE = "sensor";
   3278 
   3279     /**
   3280      * Use with {@link #getSystemService} to retrieve a {@link
   3281      * android.os.storage.StorageManager} for accessing system storage
   3282      * functions.
   3283      *
   3284      * @see #getSystemService
   3285      * @see android.os.storage.StorageManager
   3286      */
   3287     public static final String STORAGE_SERVICE = "storage";
   3288 
   3289     /**
   3290      * Use with {@link #getSystemService} to retrieve a {@link
   3291      * android.app.usage.StorageStatsManager} for accessing system storage
   3292      * statistics.
   3293      *
   3294      * @see #getSystemService
   3295      * @see android.app.usage.StorageStatsManager
   3296      */
   3297     public static final String STORAGE_STATS_SERVICE = "storagestats";
   3298 
   3299     /**
   3300      * Use with {@link #getSystemService} to retrieve a
   3301      * com.android.server.WallpaperService for accessing wallpapers.
   3302      *
   3303      * @see #getSystemService
   3304      */
   3305     public static final String WALLPAPER_SERVICE = "wallpaper";
   3306 
   3307     /**
   3308      * Use with {@link #getSystemService} to retrieve a {@link
   3309      * android.os.Vibrator} for interacting with the vibration hardware.
   3310      *
   3311      * @see #getSystemService
   3312      * @see android.os.Vibrator
   3313      */
   3314     public static final String VIBRATOR_SERVICE = "vibrator";
   3315 
   3316     /**
   3317      * Use with {@link #getSystemService} to retrieve a {@link
   3318      * android.app.StatusBarManager} for interacting with the status bar.
   3319      *
   3320      * @see #getSystemService
   3321      * @see android.app.StatusBarManager
   3322      * @hide
   3323      */
   3324     public static final String STATUS_BAR_SERVICE = "statusbar";
   3325 
   3326     /**
   3327      * Use with {@link #getSystemService} to retrieve a {@link
   3328      * android.net.ConnectivityManager} for handling management of
   3329      * network connections.
   3330      *
   3331      * @see #getSystemService
   3332      * @see android.net.ConnectivityManager
   3333      */
   3334     public static final String CONNECTIVITY_SERVICE = "connectivity";
   3335 
   3336     /**
   3337      * Use with {@link #getSystemService} to retrieve a
   3338      * {@link android.net.IpSecManager} for encrypting Sockets or Networks with
   3339      * IPSec.
   3340      *
   3341      * @hide
   3342      * @see #getSystemService
   3343      */
   3344     public static final String IPSEC_SERVICE = "ipsec";
   3345 
   3346     /**
   3347      * Use with {@link #getSystemService} to retrieve a {@link
   3348      * android.os.IUpdateLock} for managing runtime sequences that
   3349      * must not be interrupted by headless OTA application or similar.
   3350      *
   3351      * @hide
   3352      * @see #getSystemService
   3353      * @see android.os.UpdateLock
   3354      */
   3355     public static final String UPDATE_LOCK_SERVICE = "updatelock";
   3356 
   3357     /**
   3358      * Constant for the internal network management service, not really a Context service.
   3359      * @hide
   3360      */
   3361     public static final String NETWORKMANAGEMENT_SERVICE = "network_management";
   3362 
   3363     /**
   3364      * Use with {@link #getSystemService} to retrieve a {@link
   3365      * android.app.usage.NetworkStatsManager} for querying network usage stats.
   3366      *
   3367      * @see #getSystemService
   3368      * @see android.app.usage.NetworkStatsManager
   3369      */
   3370     public static final String NETWORK_STATS_SERVICE = "netstats";
   3371     /** {@hide} */
   3372     public static final String NETWORK_POLICY_SERVICE = "netpolicy";
   3373 
   3374     /**
   3375      * Use with {@link #getSystemService} to retrieve a {@link
   3376      * android.net.wifi.WifiManager} for handling management of
   3377      * Wi-Fi access.
   3378      *
   3379      * @see #getSystemService
   3380      * @see android.net.wifi.WifiManager
   3381      */
   3382     public static final String WIFI_SERVICE = "wifi";
   3383 
   3384     /**
   3385      * Use with {@link #getSystemService} to retrieve a {@link
   3386      * android.net.wifi.p2p.WifiP2pManager} for handling management of
   3387      * Wi-Fi peer-to-peer connections.
   3388      *
   3389      * @see #getSystemService
   3390      * @see android.net.wifi.p2p.WifiP2pManager
   3391      */
   3392     public static final String WIFI_P2P_SERVICE = "wifip2p";
   3393 
   3394     /**
   3395      * Use with {@link #getSystemService} to retrieve a
   3396      * {@link android.net.wifi.aware.WifiAwareManager} for handling management of
   3397      * Wi-Fi Aware.
   3398      *
   3399      * @see #getSystemService
   3400      * @see android.net.wifi.aware.WifiAwareManager
   3401      */
   3402     public static final String WIFI_AWARE_SERVICE = "wifiaware";
   3403 
   3404     /**
   3405      * Use with {@link #getSystemService} to retrieve a {@link
   3406      * android.net.wifi.WifiScanner} for scanning the wifi universe
   3407      *
   3408      * @see #getSystemService
   3409      * @see android.net.wifi.WifiScanner
   3410      * @hide
   3411      */
   3412     @SystemApi
   3413     public static final String WIFI_SCANNING_SERVICE = "wifiscanner";
   3414 
   3415     /**
   3416      * Use with {@link #getSystemService} to retrieve a {@link
   3417      * android.net.wifi.RttManager} for ranging devices with wifi
   3418      *
   3419      * @see #getSystemService
   3420      * @see android.net.wifi.RttManager
   3421      * @hide
   3422      */
   3423     @SystemApi
   3424     public static final String WIFI_RTT_SERVICE = "rttmanager";
   3425 
   3426     /**
   3427      * Use with {@link #getSystemService} to retrieve a {@link
   3428      * android.net.EthernetManager} for handling management of
   3429      * Ethernet access.
   3430      *
   3431      * @see #getSystemService
   3432      * @see android.net.EthernetManager
   3433      *
   3434      * @hide
   3435      */
   3436     public static final String ETHERNET_SERVICE = "ethernet";
   3437 
   3438     /**
   3439      * Use with {@link #getSystemService} to retrieve a {@link
   3440      * android.net.nsd.NsdManager} for handling management of network service
   3441      * discovery
   3442      *
   3443      * @see #getSystemService
   3444      * @see android.net.nsd.NsdManager
   3445      */
   3446     public static final String NSD_SERVICE = "servicediscovery";
   3447 
   3448     /**
   3449      * Use with {@link #getSystemService} to retrieve a
   3450      * {@link android.media.AudioManager} for handling management of volume,
   3451      * ringer modes and audio routing.
   3452      *
   3453      * @see #getSystemService
   3454      * @see android.media.AudioManager
   3455      */
   3456     public static final String AUDIO_SERVICE = "audio";
   3457 
   3458     /**
   3459      * Use with {@link #getSystemService} to retrieve a
   3460      * {@link android.hardware.fingerprint.FingerprintManager} for handling management
   3461      * of fingerprints.
   3462      *
   3463      * @see #getSystemService
   3464      * @see android.hardware.fingerprint.FingerprintManager
   3465      */
   3466     public static final String FINGERPRINT_SERVICE = "fingerprint";
   3467 
   3468     /**
   3469      * Use with {@link #getSystemService} to retrieve a
   3470      * {@link android.media.MediaRouter} for controlling and managing
   3471      * routing of media.
   3472      *
   3473      * @see #getSystemService
   3474      * @see android.media.MediaRouter
   3475      */
   3476     public static final String MEDIA_ROUTER_SERVICE = "media_router";
   3477 
   3478     /**
   3479      * Use with {@link #getSystemService} to retrieve a
   3480      * {@link android.media.session.MediaSessionManager} for managing media Sessions.
   3481      *
   3482      * @see #getSystemService
   3483      * @see android.media.session.MediaSessionManager
   3484      */
   3485     public static final String MEDIA_SESSION_SERVICE = "media_session";
   3486 
   3487     /**
   3488      * Use with {@link #getSystemService} to retrieve a
   3489      * {@link android.telephony.TelephonyManager} for handling management the
   3490      * telephony features of the device.
   3491      *
   3492      * @see #getSystemService
   3493      * @see android.telephony.TelephonyManager
   3494      */
   3495     public static final String TELEPHONY_SERVICE = "phone";
   3496 
   3497     /**
   3498      * Use with {@link #getSystemService} to retrieve a
   3499      * {@link android.telephony.SubscriptionManager} for handling management the
   3500      * telephony subscriptions of the device.
   3501      *
   3502      * @see #getSystemService
   3503      * @see android.telephony.SubscriptionManager
   3504      */
   3505     public static final String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
   3506 
   3507     /**
   3508      * Use with {@link #getSystemService} to retrieve a
   3509      * {@link android.telecom.TelecomManager} to manage telecom-related features
   3510      * of the device.
   3511      *
   3512      * @see #getSystemService
   3513      * @see android.telecom.TelecomManager
   3514      */
   3515     public static final String TELECOM_SERVICE = "telecom";
   3516 
   3517     /**
   3518      * Use with {@link #getSystemService} to retrieve a
   3519      * {@link android.telephony.CarrierConfigManager} for reading carrier configuration values.
   3520      *
   3521      * @see #getSystemService
   3522      * @see android.telephony.CarrierConfigManager
   3523      */
   3524     public static final String CARRIER_CONFIG_SERVICE = "carrier_config";
   3525 
   3526     /**
   3527      * Use with {@link #getSystemService} to retrieve a
   3528      * {@link android.text.ClipboardManager} for accessing and modifying
   3529      * {@link android.content.ClipboardManager} for accessing and modifying
   3530      * the contents of the global clipboard.
   3531      *
   3532      * @see #getSystemService
   3533      * @see android.content.ClipboardManager
   3534      */
   3535     public static final String CLIPBOARD_SERVICE = "clipboard";
   3536 
   3537     /**
   3538      * Use with {@link #getSystemService} to retrieve a
   3539      * {@link TextClassificationManager} for text classification services.
   3540      *
   3541      * @see #getSystemService
   3542      * @see TextClassificationManager
   3543      */
   3544     public static final String TEXT_CLASSIFICATION_SERVICE = "textclassification";
   3545 
   3546     /**
   3547      * Use with {@link #getSystemService} to retrieve a
   3548      * {@link android.view.inputmethod.InputMethodManager} for accessing input
   3549      * methods.
   3550      *
   3551      * @see #getSystemService
   3552      */
   3553     public static final String INPUT_METHOD_SERVICE = "input_method";
   3554 
   3555     /**
   3556      * Use with {@link #getSystemService} to retrieve a
   3557      * {@link android.view.textservice.TextServicesManager} for accessing
   3558      * text services.
   3559      *
   3560      * @see #getSystemService
   3561      */
   3562     public static final String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
   3563 
   3564     /**
   3565      * Use with {@link #getSystemService} to retrieve a
   3566      * {@link android.appwidget.AppWidgetManager} for accessing AppWidgets.
   3567      *
   3568      * @see #getSystemService
   3569      */
   3570     public static final String APPWIDGET_SERVICE = "appwidget";
   3571 
   3572     /**
   3573      * Official published name of the (internal) voice interaction manager service.
   3574      *
   3575      * @hide
   3576      * @see #getSystemService
   3577      */
   3578     public static final String VOICE_INTERACTION_MANAGER_SERVICE = "voiceinteraction";
   3579 
   3580     /**
   3581      * Official published name of the (internal) autofill service.
   3582      *
   3583      * @hide
   3584      * @see #getSystemService
   3585      */
   3586     public static final String AUTOFILL_MANAGER_SERVICE = "autofill";
   3587 
   3588     /**
   3589      * Use with {@link #getSystemService} to access the
   3590      * {@link com.android.server.voiceinteraction.SoundTriggerService}.
   3591      *
   3592      * @hide
   3593      * @see #getSystemService
   3594      */
   3595     public static final String SOUND_TRIGGER_SERVICE = "soundtrigger";
   3596 
   3597 
   3598     /**
   3599      * Use with {@link #getSystemService} to retrieve an
   3600      * {@link android.app.backup.IBackupManager IBackupManager} for communicating
   3601      * with the backup mechanism.
   3602      * @hide
   3603      *
   3604      * @see #getSystemService
   3605      */
   3606     @SystemApi
   3607     public static final String BACKUP_SERVICE = "backup";
   3608 
   3609     /**
   3610      * Use with {@link #getSystemService} to retrieve a
   3611      * {@link android.os.DropBoxManager} instance for recording
   3612      * diagnostic logs.
   3613      * @see #getSystemService
   3614      */
   3615     public static final String DROPBOX_SERVICE = "dropbox";
   3616 
   3617     /**
   3618      * System service name for the DeviceIdleController.  There is no Java API for this.
   3619      * @see #getSystemService
   3620      * @hide
   3621      */
   3622     public static final String DEVICE_IDLE_CONTROLLER = "deviceidle";
   3623 
   3624     /**
   3625      * Use with {@link #getSystemService} to retrieve a
   3626      * {@link android.app.admin.DevicePolicyManager} for working with global
   3627      * device policy management.
   3628      *
   3629      * @see #getSystemService
   3630      */
   3631     public static final String DEVICE_POLICY_SERVICE = "device_policy";
   3632 
   3633     /**
   3634      * Use with {@link #getSystemService} to retrieve a
   3635      * {@link android.app.UiModeManager} for controlling UI modes.
   3636      *
   3637      * @see #getSystemService
   3638      */
   3639     public static final String UI_MODE_SERVICE = "uimode";
   3640 
   3641     /**
   3642      * Use with {@link #getSystemService} to retrieve a
   3643      * {@link android.app.DownloadManager} for requesting HTTP downloads.
   3644      *
   3645      * @see #getSystemService
   3646      */
   3647     public static final String DOWNLOAD_SERVICE = "download";
   3648 
   3649     /**
   3650      * Use with {@link #getSystemService} to retrieve a
   3651      * {@link android.os.BatteryManager} for managing battery state.
   3652      *
   3653      * @see #getSystemService
   3654      */
   3655     public static final String BATTERY_SERVICE = "batterymanager";
   3656 
   3657     /**
   3658      * Use with {@link #getSystemService} to retrieve a
   3659      * {@link android.nfc.NfcManager} for using NFC.
   3660      *
   3661      * @see #getSystemService
   3662      */
   3663     public static final String NFC_SERVICE = "nfc";
   3664 
   3665     /**
   3666      * Use with {@link #getSystemService} to retrieve a
   3667      * {@link android.bluetooth.BluetoothManager} for using Bluetooth.
   3668      *
   3669      * @see #getSystemService
   3670      */
   3671     public static final String BLUETOOTH_SERVICE = "bluetooth";
   3672 
   3673     /**
   3674      * Use with {@link #getSystemService} to retrieve a
   3675      * {@link android.net.sip.SipManager} for accessing the SIP related service.
   3676      *
   3677      * @see #getSystemService
   3678      */
   3679     /** @hide */
   3680     public static final String SIP_SERVICE = "sip";
   3681 
   3682     /**
   3683      * Use with {@link #getSystemService} to retrieve a {@link
   3684      * android.hardware.usb.UsbManager} for access to USB devices (as a USB host)
   3685      * and for controlling this device's behavior as a USB device.
   3686      *
   3687      * @see #getSystemService
   3688      * @see android.hardware.usb.UsbManager
   3689      */
   3690     public static final String USB_SERVICE = "usb";
   3691 
   3692     /**
   3693      * Use with {@link #getSystemService} to retrieve a {@link
   3694      * android.hardware.SerialManager} for access to serial ports.
   3695      *
   3696      * @see #getSystemService
   3697      * @see android.hardware.SerialManager
   3698      *
   3699      * @hide
   3700      */
   3701     public static final String SERIAL_SERVICE = "serial";
   3702 
   3703     /**
   3704      * Use with {@link #getSystemService} to retrieve a
   3705      * {@link android.hardware.hdmi.HdmiControlManager} for controlling and managing
   3706      * HDMI-CEC protocol.
   3707      *
   3708      * @see #getSystemService
   3709      * @see android.hardware.hdmi.HdmiControlManager
   3710      * @hide
   3711      */
   3712     @SystemApi
   3713     public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
   3714 
   3715     /**
   3716      * Use with {@link #getSystemService} to retrieve a
   3717      * {@link android.hardware.input.InputManager} for interacting with input devices.
   3718      *
   3719      * @see #getSystemService
   3720      * @see android.hardware.input.InputManager
   3721      */
   3722     public static final String INPUT_SERVICE = "input";
   3723 
   3724     /**
   3725      * Use with {@link #getSystemService} to retrieve a
   3726      * {@link android.hardware.display.DisplayManager} for interacting with display devices.
   3727      *
   3728      * @see #getSystemService
   3729      * @see android.hardware.display.DisplayManager
   3730      */
   3731     public static final String DISPLAY_SERVICE = "display";
   3732 
   3733     /**
   3734      * Use with {@link #getSystemService} to retrieve a
   3735      * {@link android.os.UserManager} for managing users on devices that support multiple users.
   3736      *
   3737      * @see #getSystemService
   3738      * @see android.os.UserManager
   3739      */
   3740     public static final String USER_SERVICE = "user";
   3741 
   3742     /**
   3743      * Use with {@link #getSystemService} to retrieve a
   3744      * {@link android.content.pm.LauncherApps} for querying and monitoring launchable apps across
   3745      * profiles of a user.
   3746      *
   3747      * @see #getSystemService
   3748      * @see android.content.pm.LauncherApps
   3749      */
   3750     public static final String LAUNCHER_APPS_SERVICE = "launcherapps";
   3751 
   3752     /**
   3753      * Use with {@link #getSystemService} to retrieve a
   3754      * {@link android.content.RestrictionsManager} for retrieving application restrictions
   3755      * and requesting permissions for restricted operations.
   3756      * @see #getSystemService
   3757      * @see android.content.RestrictionsManager
   3758      */
   3759     public static final String RESTRICTIONS_SERVICE = "restrictions";
   3760 
   3761     /**
   3762      * Use with {@link #getSystemService} to retrieve a
   3763      * {@link android.app.AppOpsManager} for tracking application operations
   3764      * on the device.
   3765      *
   3766      * @see #getSystemService
   3767      * @see android.app.AppOpsManager
   3768      */
   3769     public static final String APP_OPS_SERVICE = "appops";
   3770 
   3771     /**
   3772      * Use with {@link #getSystemService} to retrieve a
   3773      * {@link android.hardware.camera2.CameraManager} for interacting with
   3774      * camera devices.
   3775      *
   3776      * @see #getSystemService
   3777      * @see android.hardware.camera2.CameraManager
   3778      */
   3779     public static final String CAMERA_SERVICE = "camera";
   3780 
   3781     /**
   3782      * {@link android.print.PrintManager} for printing and managing
   3783      * printers and print tasks.
   3784      *
   3785      * @see #getSystemService
   3786      * @see android.print.PrintManager
   3787      */
   3788     public static final String PRINT_SERVICE = "print";
   3789 
   3790     /**
   3791      * Use with {@link #getSystemService} to retrieve a
   3792      * {@link android.companion.CompanionDeviceManager} for managing companion devices
   3793      *
   3794      * @see #getSystemService
   3795      * @see android.companion.CompanionDeviceManager
   3796      */
   3797     public static final String COMPANION_DEVICE_SERVICE = "companiondevice";
   3798 
   3799     /**
   3800      * Use with {@link #getSystemService} to retrieve a
   3801      * {@link android.hardware.ConsumerIrManager} for transmitting infrared
   3802      * signals from the device.
   3803      *
   3804      * @see #getSystemService
   3805      * @see android.hardware.ConsumerIrManager
   3806      */
   3807     public static final String CONSUMER_IR_SERVICE = "consumer_ir";
   3808 
   3809     /**
   3810      * {@link android.app.trust.TrustManager} for managing trust agents.
   3811      * @see #getSystemService
   3812      * @see android.app.trust.TrustManager
   3813      * @hide
   3814      */
   3815     public static final String TRUST_SERVICE = "trust";
   3816 
   3817     /**
   3818      * Use with {@link #getSystemService} to retrieve a
   3819      * {@link android.media.tv.TvInputManager} for interacting with TV inputs
   3820      * on the device.
   3821      *
   3822      * @see #getSystemService
   3823      * @see android.media.tv.TvInputManager
   3824      */
   3825     public static final String TV_INPUT_SERVICE = "tv_input";
   3826 
   3827     /**
   3828      * {@link android.net.NetworkScoreManager} for managing network scoring.
   3829      * @see #getSystemService
   3830      * @see android.net.NetworkScoreManager
   3831      * @hide
   3832      */
   3833     @SystemApi
   3834     public static final String NETWORK_SCORE_SERVICE = "network_score";
   3835 
   3836     /**
   3837      * Use with {@link #getSystemService} to retrieve a {@link
   3838      * android.app.usage.UsageStatsManager} for querying device usage stats.
   3839      *
   3840      * @see #getSystemService
   3841      * @see android.app.usage.UsageStatsManager
   3842      */
   3843     public static final String USAGE_STATS_SERVICE = "usagestats";
   3844 
   3845     /**
   3846      * Use with {@link #getSystemService} to retrieve a {@link
   3847      * android.app.job.JobScheduler} instance for managing occasional
   3848      * background tasks.
   3849      * @see #getSystemService
   3850      * @see android.app.job.JobScheduler
   3851      */
   3852     public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
   3853 
   3854     /**
   3855      * Use with {@link #getSystemService} to retrieve a {@link
   3856      * android.service.persistentdata.PersistentDataBlockManager} instance
   3857      * for interacting with a storage device that lives across factory resets.
   3858      *
   3859      * @see #getSystemService
   3860      * @see android.service.persistentdata.PersistentDataBlockManager
   3861      * @hide
   3862      */
   3863     @SystemApi
   3864     public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
   3865 
   3866     /**
   3867      * Use with {@link #getSystemService} to retrieve a {@link
   3868      * android.service.oemlock.OemLockManager} instance for managing the OEM lock.
   3869      *
   3870      * @see #getSystemService
   3871      * @see android.service.oemlock.OemLockManager
   3872      * @hide
   3873      */
   3874     @SystemApi
   3875     public static final String OEM_LOCK_SERVICE = "oem_lock";
   3876 
   3877     /**
   3878      * Use with {@link #getSystemService} to retrieve a {@link
   3879      * android.media.projection.MediaProjectionManager} instance for managing
   3880      * media projection sessions.
   3881      * @see #getSystemService
   3882      * @see android.media.projection.MediaProjectionManager
   3883      */
   3884     public static final String MEDIA_PROJECTION_SERVICE = "media_projection";
   3885 
   3886     /**
   3887      * Use with {@link #getSystemService} to retrieve a
   3888      * {@link android.media.midi.MidiManager} for accessing the MIDI service.
   3889      *
   3890      * @see #getSystemService
   3891      */
   3892     public static final String MIDI_SERVICE = "midi";
   3893 
   3894 
   3895     /**
   3896      * Use with {@link #getSystemService} to retrieve a
   3897      * {@link android.hardware.radio.RadioManager} for accessing the broadcast radio service.
   3898      *
   3899      * @see #getSystemService
   3900      * @hide
   3901      */
   3902     public static final String RADIO_SERVICE = "radio";
   3903 
   3904     /**
   3905      * Use with {@link #getSystemService} to retrieve a
   3906      * {@link android.os.HardwarePropertiesManager} for accessing the hardware properties service.
   3907      *
   3908      * @see #getSystemService
   3909      */
   3910     public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
   3911 
   3912     /**
   3913      * Use with {@link #getSystemService} to retrieve a
   3914      * {@link android.content.pm.ShortcutManager} for accessing the launcher shortcut service.
   3915      *
   3916      * @see #getSystemService
   3917      * @see android.content.pm.ShortcutManager
   3918      */
   3919     public static final String SHORTCUT_SERVICE = "shortcut";
   3920 
   3921     /**
   3922      * Use with {@link #getSystemService} to retrieve a {@link
   3923      * android.hardware.location.ContextHubManager} for accessing context hubs.
   3924      *
   3925      * @see #getSystemService
   3926      * @see android.hardware.location.ContextHubManager
   3927      *
   3928      * @hide
   3929      */
   3930     @SystemApi
   3931     public static final String CONTEXTHUB_SERVICE = "contexthub";
   3932 
   3933     /**
   3934      * Use with {@link #getSystemService} to retrieve a
   3935      * {@link android.os.health.SystemHealthManager} for accessing system health (battery, power,
   3936      * memory, etc) metrics.
   3937      *
   3938      * @see #getSystemService
   3939      */
   3940     public static final String SYSTEM_HEALTH_SERVICE = "systemhealth";
   3941 
   3942     /**
   3943      * Gatekeeper Service.
   3944      * @hide
   3945      */
   3946     public static final String GATEKEEPER_SERVICE = "android.service.gatekeeper.IGateKeeperService";
   3947 
   3948     /**
   3949      * Service defining the policy for access to device identifiers.
   3950      * @hide
   3951      */
   3952     public static final String DEVICE_IDENTIFIERS_SERVICE = "device_identifiers";
   3953 
   3954     /**
   3955      * Service to report a system health "incident"
   3956      * @hide
   3957      */
   3958     public static final String INCIDENT_SERVICE = "incident";
   3959 
   3960     /**
   3961      * Use with {@link #getSystemService} to retrieve a {@link
   3962      * android.content.om.OverlayManager} for managing overlay packages.
   3963      *
   3964      * @see #getSystemService
   3965      * @see android.content.om.OverlayManager
   3966      * @hide
   3967      */
   3968     public static final String OVERLAY_SERVICE = "overlay";
   3969 
   3970     /**
   3971      * Use with {@link #getSystemService} to retrieve a
   3972      * {@link VrManager} for accessing the VR service.
   3973      *
   3974      * @see #getSystemService
   3975      * @hide
   3976      */
   3977     @SystemApi
   3978     public static final String VR_SERVICE = "vrmanager";
   3979 
   3980     /**
   3981      * Determine whether the given permission is allowed for a particular
   3982      * process and user ID running in the system.
   3983      *
   3984      * @param permission The name of the permission being checked.
   3985      * @param pid The process ID being checked against.  Must be > 0.
   3986      * @param uid The user ID being checked against.  A uid of 0 is the root
   3987      * user, which will pass every permission check.
   3988      *
   3989      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
   3990      * pid/uid is allowed that permission, or
   3991      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3992      *
   3993      * @see PackageManager#checkPermission(String, String)
   3994      * @see #checkCallingPermission
   3995      */
   3996     @CheckResult(suggest="#enforcePermission(String,int,int,String)")
   3997     @PackageManager.PermissionResult
   3998     public abstract int checkPermission(@NonNull String permission, int pid, int uid);
   3999 
   4000     /** @hide */
   4001     @PackageManager.PermissionResult
   4002     public abstract int checkPermission(@NonNull String permission, int pid, int uid,
   4003             IBinder callerToken);
   4004 
   4005     /**
   4006      * Determine whether the calling process of an IPC you are handling has been
   4007      * granted a particular permission.  This is basically the same as calling
   4008      * {@link #checkPermission(String, int, int)} with the pid and uid returned
   4009      * by {@link android.os.Binder#getCallingPid} and
   4010      * {@link android.os.Binder#getCallingUid}.  One important difference
   4011      * is that if you are not currently processing an IPC, this function
   4012      * will always fail.  This is done to protect against accidentally
   4013      * leaking permissions; you can use {@link #checkCallingOrSelfPermission}
   4014      * to avoid this protection.
   4015      *
   4016      * @param permission The name of the permission being checked.
   4017      *
   4018      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
   4019      * pid/uid is allowed that permission, or
   4020      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4021      *
   4022      * @see PackageManager#checkPermission(String, String)
   4023      * @see #checkPermission
   4024      * @see #checkCallingOrSelfPermission
   4025      */
   4026     @CheckResult(suggest="#enforceCallingPermission(String,String)")
   4027     @PackageManager.PermissionResult
   4028     public abstract int checkCallingPermission(@NonNull String permission);
   4029 
   4030     /**
   4031      * Determine whether the calling process of an IPC <em>or you</em> have been
   4032      * granted a particular permission.  This is the same as
   4033      * {@link #checkCallingPermission}, except it grants your own permissions
   4034      * if you are not currently processing an IPC.  Use with care!
   4035      *
   4036      * @param permission The name of the permission being checked.
   4037      *
   4038      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
   4039      * pid/uid is allowed that permission, or
   4040      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4041      *
   4042      * @see PackageManager#checkPermission(String, String)
   4043      * @see #checkPermission
   4044      * @see #checkCallingPermission
   4045      */
   4046     @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)")
   4047     @PackageManager.PermissionResult
   4048     public abstract int checkCallingOrSelfPermission(@NonNull String permission);
   4049 
   4050     /**
   4051      * Determine whether <em>you</em> have been granted a particular permission.
   4052      *
   4053      * @param permission The name of the permission being checked.
   4054      *
   4055      * @return {@link PackageManager#PERMISSION_GRANTED} if you have the
   4056      * permission, or {@link PackageManager#PERMISSION_DENIED} if not.
   4057      *
   4058      * @see PackageManager#checkPermission(String, String)
   4059      * @see #checkCallingPermission(String)
   4060      */
   4061     @PackageManager.PermissionResult
   4062     public abstract int checkSelfPermission(@NonNull String permission);
   4063 
   4064     /**
   4065      * If the given permission is not allowed for a particular process
   4066      * and user ID running in the system, throw a {@link SecurityException}.
   4067      *
   4068      * @param permission The name of the permission being checked.
   4069      * @param pid The process ID being checked against.  Must be &gt; 0.
   4070      * @param uid The user ID being checked against.  A uid of 0 is the root
   4071      * user, which will pass every permission check.
   4072      * @param message A message to include in the exception if it is thrown.
   4073      *
   4074      * @see #checkPermission(String, int, int)
   4075      */
   4076     public abstract void enforcePermission(
   4077             @NonNull String permission, int pid, int uid, @Nullable String message);
   4078 
   4079     /**
   4080      * If the calling process of an IPC you are handling has not been
   4081      * granted a particular permission, throw a {@link
   4082      * SecurityException}.  This is basically the same as calling
   4083      * {@link #enforcePermission(String, int, int, String)} with the
   4084      * pid and uid returned by {@link android.os.Binder#getCallingPid}
   4085      * and {@link android.os.Binder#getCallingUid}.  One important
   4086      * difference is that if you are not currently processing an IPC,
   4087      * this function will always throw the SecurityException.  This is
   4088      * done to protect against accidentally leaking permissions; you
   4089      * can use {@link #enforceCallingOrSelfPermission} to avoid this
   4090      * protection.
   4091      *
   4092      * @param permission The name of the permission being checked.
   4093      * @param message A message to include in the exception if it is thrown.
   4094      *
   4095      * @see #checkCallingPermission(String)
   4096      */
   4097     public abstract void enforceCallingPermission(
   4098             @NonNull String permission, @Nullable String message);
   4099 
   4100     /**
   4101      * If neither you nor the calling process of an IPC you are
   4102      * handling has been granted a particular permission, throw a
   4103      * {@link SecurityException}.  This is the same as {@link
   4104      * #enforceCallingPermission}, except it grants your own
   4105      * permissions if you are not currently processing an IPC.  Use
   4106      * with care!
   4107      *
   4108      * @param permission The name of the permission being checked.
   4109      * @param message A message to include in the exception if it is thrown.
   4110      *
   4111      * @see #checkCallingOrSelfPermission(String)
   4112      */
   4113     public abstract void enforceCallingOrSelfPermission(
   4114             @NonNull String permission, @Nullable String message);
   4115 
   4116     /**
   4117      * Grant permission to access a specific Uri to another package, regardless
   4118      * of whether that package has general permission to access the Uri's
   4119      * content provider.  This can be used to grant specific, temporary
   4120      * permissions, typically in response to user interaction (such as the
   4121      * user opening an attachment that you would like someone else to
   4122      * display).
   4123      *
   4124      * <p>Normally you should use {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
   4125      * Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   4126      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
   4127      * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} with the Intent being used to
   4128      * start an activity instead of this function directly.  If you use this
   4129      * function directly, you should be sure to call
   4130      * {@link #revokeUriPermission} when the target should no longer be allowed
   4131      * to access it.
   4132      *
   4133      * <p>To succeed, the content provider owning the Uri must have set the
   4134      * {@link android.R.styleable#AndroidManifestProvider_grantUriPermissions
   4135      * grantUriPermissions} attribute in its manifest or included the
   4136      * {@link android.R.styleable#AndroidManifestGrantUriPermission
   4137      * &lt;grant-uri-permissions&gt;} tag.
   4138      *
   4139      * @param toPackage The package you would like to allow to access the Uri.
   4140      * @param uri The Uri you would like to grant access to.
   4141      * @param modeFlags The desired access modes.
   4142      *
   4143      * @see #revokeUriPermission
   4144      */
   4145     public abstract void grantUriPermission(String toPackage, Uri uri,
   4146             @Intent.GrantUriMode int modeFlags);
   4147 
   4148     /**
   4149      * Remove all permissions to access a particular content provider Uri
   4150      * that were previously added with {@link #grantUriPermission} or <em>any other</em> mechanism.
   4151      * The given Uri will match all previously granted Uris that are the same or a
   4152      * sub-path of the given Uri.  That is, revoking "content://foo/target" will
   4153      * revoke both "content://foo/target" and "content://foo/target/sub", but not
   4154      * "content://foo".  It will not remove any prefix grants that exist at a
   4155      * higher level.
   4156      *
   4157      * <p>Prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, if you did not have
   4158      * regular permission access to a Uri, but had received access to it through
   4159      * a specific Uri permission grant, you could not revoke that grant with this
   4160      * function and a {@link SecurityException} would be thrown.  As of
   4161      * {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this function will not throw a security
   4162      * exception, but will remove whatever permission grants to the Uri had been given to the app
   4163      * (or none).</p>
   4164      *
   4165      * <p>Unlike {@link #revokeUriPermission(String, Uri, int)}, this method impacts all permission
   4166      * grants matching the given Uri, for any package they had been granted to, through any
   4167      * mechanism this had happened (such as indirectly through the clipboard, activity launch,
   4168      * service start, etc).  That means this can be potentially dangerous to use, as it can
   4169      * revoke grants that another app could be strongly expecting to stick around.</p>
   4170      *
   4171      * @param uri The Uri you would like to revoke access to.
   4172      * @param modeFlags The access modes to revoke.
   4173      *
   4174      * @see #grantUriPermission
   4175      */
   4176     public abstract void revokeUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
   4177 
   4178     /**
   4179      * Remove permissions to access a particular content provider Uri
   4180      * that were previously added with {@link #grantUriPermission} for a specific target
   4181      * package.  The given Uri will match all previously granted Uris that are the same or a
   4182      * sub-path of the given Uri.  That is, revoking "content://foo/target" will
   4183      * revoke both "content://foo/target" and "content://foo/target/sub", but not
   4184      * "content://foo".  It will not remove any prefix grants that exist at a
   4185      * higher level.
   4186      *
   4187      * <p>Unlike {@link #revokeUriPermission(Uri, int)}, this method will <em>only</em>
   4188      * revoke permissions that had been explicitly granted through {@link #grantUriPermission}
   4189      * and only for the package specified.  Any matching grants that have happened through
   4190      * other mechanisms (clipboard, activity launching, service starting, etc) will not be
   4191      * removed.</p>
   4192      *
   4193      * @param toPackage The package you had previously granted access to.
   4194      * @param uri The Uri you would like to revoke access to.
   4195      * @param modeFlags The access modes to revoke.
   4196      *
   4197      * @see #grantUriPermission
   4198      */
   4199     public abstract void revokeUriPermission(String toPackage, Uri uri,
   4200             @Intent.AccessUriMode int modeFlags);
   4201 
   4202     /**
   4203      * Determine whether a particular process and user ID has been granted
   4204      * permission to access a specific URI.  This only checks for permissions
   4205      * that have been explicitly granted -- if the given process/uid has
   4206      * more general access to the URI's content provider then this check will
   4207      * always fail.
   4208      *
   4209      * @param uri The uri that is being checked.
   4210      * @param pid The process ID being checked against.  Must be &gt; 0.
   4211      * @param uid The user ID being checked against.  A uid of 0 is the root
   4212      * user, which will pass every permission check.
   4213      * @param modeFlags The access modes to check.
   4214      *
   4215      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
   4216      * pid/uid is allowed to access that uri, or
   4217      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4218      *
   4219      * @see #checkCallingUriPermission
   4220      */
   4221     @CheckResult(suggest="#enforceUriPermission(Uri,int,int,String)")
   4222     @PackageManager.PermissionResult
   4223     public abstract int checkUriPermission(Uri uri, int pid, int uid,
   4224             @Intent.AccessUriMode int modeFlags);
   4225 
   4226     /** @hide */
   4227     @PackageManager.PermissionResult
   4228     public abstract int checkUriPermission(Uri uri, int pid, int uid,
   4229             @Intent.AccessUriMode int modeFlags, IBinder callerToken);
   4230 
   4231     /**
   4232      * Determine whether the calling process and user ID has been
   4233      * granted permission to access a specific URI.  This is basically
   4234      * the same as calling {@link #checkUriPermission(Uri, int, int,
   4235      * int)} with the pid and uid returned by {@link
   4236      * android.os.Binder#getCallingPid} and {@link
   4237      * android.os.Binder#getCallingUid}.  One important difference is
   4238      * that if you are not currently processing an IPC, this function
   4239      * will always fail.
   4240      *
   4241      * @param uri The uri that is being checked.
   4242      * @param modeFlags The access modes to check.
   4243      *
   4244      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   4245      * is allowed to access that uri, or
   4246      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4247      *
   4248      * @see #checkUriPermission(Uri, int, int, int)
   4249      */
   4250     @CheckResult(suggest="#enforceCallingUriPermission(Uri,int,String)")
   4251     @PackageManager.PermissionResult
   4252     public abstract int checkCallingUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
   4253 
   4254     /**
   4255      * Determine whether the calling process of an IPC <em>or you</em> has been granted
   4256      * permission to access a specific URI.  This is the same as
   4257      * {@link #checkCallingUriPermission}, except it grants your own permissions
   4258      * if you are not currently processing an IPC.  Use with care!
   4259      *
   4260      * @param uri The uri that is being checked.
   4261      * @param modeFlags The access modes to check.
   4262      *
   4263      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   4264      * is allowed to access that uri, or
   4265      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4266      *
   4267      * @see #checkCallingUriPermission
   4268      */
   4269     @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)")
   4270     @PackageManager.PermissionResult
   4271     public abstract int checkCallingOrSelfUriPermission(Uri uri,
   4272             @Intent.AccessUriMode int modeFlags);
   4273 
   4274     /**
   4275      * Check both a Uri and normal permission.  This allows you to perform
   4276      * both {@link #checkPermission} and {@link #checkUriPermission} in one
   4277      * call.
   4278      *
   4279      * @param uri The Uri whose permission is to be checked, or null to not
   4280      * do this check.
   4281      * @param readPermission The permission that provides overall read access,
   4282      * or null to not do this check.
   4283      * @param writePermission The permission that provides overall write
   4284      * access, or null to not do this check.
   4285      * @param pid The process ID being checked against.  Must be &gt; 0.
   4286      * @param uid The user ID being checked against.  A uid of 0 is the root
   4287      * user, which will pass every permission check.
   4288      * @param modeFlags The access modes to check.
   4289      *
   4290      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   4291      * is allowed to access that uri or holds one of the given permissions, or
   4292      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   4293      */
   4294     @CheckResult(suggest="#enforceUriPermission(Uri,String,String,int,int,int,String)")
   4295     @PackageManager.PermissionResult
   4296     public abstract int checkUriPermission(@Nullable Uri uri, @Nullable String readPermission,
   4297             @Nullable String writePermission, int pid, int uid,
   4298             @Intent.AccessUriMode int modeFlags);
   4299 
   4300     /**
   4301      * If a particular process and user ID has not been granted
   4302      * permission to access a specific URI, throw {@link
   4303      * SecurityException}.  This only checks for permissions that have
   4304      * been explicitly granted -- if the given process/uid has more
   4305      * general access to the URI's content provider then this check
   4306      * will always fail.
   4307      *
   4308      * @param uri The uri that is being checked.
   4309      * @param pid The process ID being checked against.  Must be &gt; 0.
   4310      * @param uid The user ID being checked against.  A uid of 0 is the root
   4311      * user, which will pass every permission check.
   4312      * @param modeFlags The access modes to enforce.
   4313      * @param message A message to include in the exception if it is thrown.
   4314      *
   4315      * @see #checkUriPermission(Uri, int, int, int)
   4316      */
   4317     public abstract void enforceUriPermission(
   4318             Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags, String message);
   4319 
   4320     /**
   4321      * If the calling process and user ID has not been granted
   4322      * permission to access a specific URI, throw {@link
   4323      * SecurityException}.  This is basically the same as calling
   4324      * {@link #enforceUriPermission(Uri, int, int, int, String)} with
   4325      * the pid and uid returned by {@link
   4326      * android.os.Binder#getCallingPid} and {@link
   4327      * android.os.Binder#getCallingUid}.  One important difference is
   4328      * that if you are not currently processing an IPC, this function
   4329      * will always throw a SecurityException.
   4330      *
   4331      * @param uri The uri that is being checked.
   4332      * @param modeFlags The access modes to enforce.
   4333      * @param message A message to include in the exception if it is thrown.
   4334      *
   4335      * @see #checkCallingUriPermission(Uri, int)
   4336      */
   4337     public abstract void enforceCallingUriPermission(
   4338             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
   4339 
   4340     /**
   4341      * If the calling process of an IPC <em>or you</em> has not been
   4342      * granted permission to access a specific URI, throw {@link
   4343      * SecurityException}.  This is the same as {@link
   4344      * #enforceCallingUriPermission}, except it grants your own
   4345      * permissions if you are not currently processing an IPC.  Use
   4346      * with care!
   4347      *
   4348      * @param uri The uri that is being checked.
   4349      * @param modeFlags The access modes to enforce.
   4350      * @param message A message to include in the exception if it is thrown.
   4351      *
   4352      * @see #checkCallingOrSelfUriPermission(Uri, int)
   4353      */
   4354     public abstract void enforceCallingOrSelfUriPermission(
   4355             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
   4356 
   4357     /**
   4358      * Enforce both a Uri and normal permission.  This allows you to perform
   4359      * both {@link #enforcePermission} and {@link #enforceUriPermission} in one
   4360      * call.
   4361      *
   4362      * @param uri The Uri whose permission is to be checked, or null to not
   4363      * do this check.
   4364      * @param readPermission The permission that provides overall read access,
   4365      * or null to not do this check.
   4366      * @param writePermission The permission that provides overall write
   4367      * access, or null to not do this check.
   4368      * @param pid The process ID being checked against.  Must be &gt; 0.
   4369      * @param uid The user ID being checked against.  A uid of 0 is the root
   4370      * user, which will pass every permission check.
   4371      * @param modeFlags The access modes to enforce.
   4372      * @param message A message to include in the exception if it is thrown.
   4373      *
   4374      * @see #checkUriPermission(Uri, String, String, int, int, int)
   4375      */
   4376     public abstract void enforceUriPermission(
   4377             @Nullable Uri uri, @Nullable String readPermission,
   4378             @Nullable String writePermission, int pid, int uid, @Intent.AccessUriMode int modeFlags,
   4379             @Nullable String message);
   4380 
   4381     /** @hide */
   4382     @IntDef(flag = true, prefix = { "CONTEXT_" }, value = {
   4383             CONTEXT_INCLUDE_CODE,
   4384             CONTEXT_IGNORE_SECURITY,
   4385             CONTEXT_RESTRICTED,
   4386             CONTEXT_DEVICE_PROTECTED_STORAGE,
   4387             CONTEXT_CREDENTIAL_PROTECTED_STORAGE,
   4388             CONTEXT_REGISTER_PACKAGE,
   4389     })
   4390     @Retention(RetentionPolicy.SOURCE)
   4391     public @interface CreatePackageOptions {}
   4392 
   4393     /**
   4394      * Flag for use with {@link #createPackageContext}: include the application
   4395      * code with the context.  This means loading code into the caller's
   4396      * process, so that {@link #getClassLoader()} can be used to instantiate
   4397      * the application's classes.  Setting this flags imposes security
   4398      * restrictions on what application context you can access; if the
   4399      * requested application can not be safely loaded into your process,
   4400      * java.lang.SecurityException will be thrown.  If this flag is not set,
   4401      * there will be no restrictions on the packages that can be loaded,
   4402      * but {@link #getClassLoader} will always return the default system
   4403      * class loader.
   4404      */
   4405     public static final int CONTEXT_INCLUDE_CODE = 0x00000001;
   4406 
   4407     /**
   4408      * Flag for use with {@link #createPackageContext}: ignore any security
   4409      * restrictions on the Context being requested, allowing it to always
   4410      * be loaded.  For use with {@link #CONTEXT_INCLUDE_CODE} to allow code
   4411      * to be loaded into a process even when it isn't safe to do so.  Use
   4412      * with extreme care!
   4413      */
   4414     public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;
   4415 
   4416     /**
   4417      * Flag for use with {@link #createPackageContext}: a restricted context may
   4418      * disable specific features. For instance, a View associated with a restricted
   4419      * context would ignore particular XML attributes.
   4420      */
   4421     public static final int CONTEXT_RESTRICTED = 0x00000004;
   4422 
   4423     /**
   4424      * Flag for use with {@link #createPackageContext}: point all file APIs at
   4425      * device-protected storage.
   4426      *
   4427      * @hide
   4428      */
   4429     public static final int CONTEXT_DEVICE_PROTECTED_STORAGE = 0x00000008;
   4430 
   4431     /**
   4432      * Flag for use with {@link #createPackageContext}: point all file APIs at
   4433      * credential-protected storage.
   4434      *
   4435      * @hide
   4436      */
   4437     public static final int CONTEXT_CREDENTIAL_PROTECTED_STORAGE = 0x00000010;
   4438 
   4439     /**
   4440      * @hide Used to indicate we should tell the activity manager about the process
   4441      * loading this code.
   4442      */
   4443     public static final int CONTEXT_REGISTER_PACKAGE = 0x40000000;
   4444 
   4445     /**
   4446      * Return a new Context object for the given application name.  This
   4447      * Context is the same as what the named application gets when it is
   4448      * launched, containing the same resources and class loader.  Each call to
   4449      * this method returns a new instance of a Context object; Context objects
   4450      * are not shared, however they share common state (Resources, ClassLoader,
   4451      * etc) so the Context instance itself is fairly lightweight.
   4452      *
   4453      * <p>Throws {@link android.content.pm.PackageManager.NameNotFoundException} if there is no
   4454      * application with the given package name.
   4455      *
   4456      * <p>Throws {@link java.lang.SecurityException} if the Context requested
   4457      * can not be loaded into the caller's process for security reasons (see
   4458      * {@link #CONTEXT_INCLUDE_CODE} for more information}.
   4459      *
   4460      * @param packageName Name of the application's package.
   4461      * @param flags Option flags.
   4462      *
   4463      * @return A {@link Context} for the application.
   4464      *
   4465      * @throws SecurityException &nbsp;
   4466      * @throws PackageManager.NameNotFoundException if there is no application with
   4467      * the given package name.
   4468      */
   4469     public abstract Context createPackageContext(String packageName,
   4470             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
   4471 
   4472     /**
   4473      * Similar to {@link #createPackageContext(String, int)}, but with a
   4474      * different {@link UserHandle}. For example, {@link #getContentResolver()}
   4475      * will open any {@link Uri} as the given user.
   4476      *
   4477      * @hide
   4478      */
   4479     public abstract Context createPackageContextAsUser(
   4480             String packageName, @CreatePackageOptions int flags, UserHandle user)
   4481             throws PackageManager.NameNotFoundException;
   4482 
   4483     /**
   4484      * Creates a context given an {@link android.content.pm.ApplicationInfo}.
   4485      *
   4486      * @hide
   4487      */
   4488     public abstract Context createApplicationContext(ApplicationInfo application,
   4489             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
   4490 
   4491     /**
   4492      * Return a new Context object for the given split name. The new Context has a ClassLoader and
   4493      * Resources object that can access the split's and all of its dependencies' code/resources.
   4494      * Each call to this method returns a new instance of a Context object;
   4495      * Context objects are not shared, however common state (ClassLoader, other Resources for
   4496      * the same split) may be so the Context itself can be fairly lightweight.
   4497      *
   4498      * @param splitName The name of the split to include, as declared in the split's
   4499      *                  <code>AndroidManifest.xml</code>.
   4500      * @return A {@link Context} with the given split's code and/or resources loaded.
   4501      */
   4502     public abstract Context createContextForSplit(String splitName)
   4503             throws PackageManager.NameNotFoundException;
   4504 
   4505     /**
   4506      * Get the userId associated with this context
   4507      * @return user id
   4508      *
   4509      * @hide
   4510      */
   4511     @TestApi
   4512     public abstract @UserIdInt int getUserId();
   4513 
   4514     /**
   4515      * Return a new Context object for the current Context but whose resources
   4516      * are adjusted to match the given Configuration.  Each call to this method
   4517      * returns a new instance of a Context object; Context objects are not
   4518      * shared, however common state (ClassLoader, other Resources for the
   4519      * same configuration) may be so the Context itself can be fairly lightweight.
   4520      *
   4521      * @param overrideConfiguration A {@link Configuration} specifying what
   4522      * values to modify in the base Configuration of the original Context's
   4523      * resources.  If the base configuration changes (such as due to an
   4524      * orientation change), the resources of this context will also change except
   4525      * for those that have been explicitly overridden with a value here.
   4526      *
   4527      * @return A {@link Context} with the given configuration override.
   4528      */
   4529     public abstract Context createConfigurationContext(
   4530             @NonNull Configuration overrideConfiguration);
   4531 
   4532     /**
   4533      * Return a new Context object for the current Context but whose resources
   4534      * are adjusted to match the metrics of the given Display.  Each call to this method
   4535      * returns a new instance of a Context object; Context objects are not
   4536      * shared, however common state (ClassLoader, other Resources for the
   4537      * same configuration) may be so the Context itself can be fairly lightweight.
   4538      *
   4539      * The returned display Context provides a {@link WindowManager}
   4540      * (see {@link #getSystemService(String)}) that is configured to show windows
   4541      * on the given display.  The WindowManager's {@link WindowManager#getDefaultDisplay}
   4542      * method can be used to retrieve the Display from the returned Context.
   4543      *
   4544      * @param display A {@link Display} object specifying the display
   4545      * for whose metrics the Context's resources should be tailored and upon which
   4546      * new windows should be shown.
   4547      *
   4548      * @return A {@link Context} for the display.
   4549      */
   4550     public abstract Context createDisplayContext(@NonNull Display display);
   4551 
   4552     /**
   4553      * Return a new Context object for the current Context but whose storage
   4554      * APIs are backed by device-protected storage.
   4555      * <p>
   4556      * On devices with direct boot, data stored in this location is encrypted
   4557      * with a key tied to the physical device, and it can be accessed
   4558      * immediately after the device has booted successfully, both
   4559      * <em>before and after</em> the user has authenticated with their
   4560      * credentials (such as a lock pattern or PIN).
   4561      * <p>
   4562      * Because device-protected data is available without user authentication,
   4563      * you should carefully limit the data you store using this Context. For
   4564      * example, storing sensitive authentication tokens or passwords in the
   4565      * device-protected area is strongly discouraged.
   4566      * <p>
   4567      * If the underlying device does not have the ability to store
   4568      * device-protected and credential-protected data using different keys, then
   4569      * both storage areas will become available at the same time. They remain as
   4570      * two distinct storage locations on disk, and only the window of
   4571      * availability changes.
   4572      * <p>
   4573      * Each call to this method returns a new instance of a Context object;
   4574      * Context objects are not shared, however common state (ClassLoader, other
   4575      * Resources for the same configuration) may be so the Context itself can be
   4576      * fairly lightweight.
   4577      *
   4578      * @see #isDeviceProtectedStorage()
   4579      */
   4580     public abstract Context createDeviceProtectedStorageContext();
   4581 
   4582     /**
   4583      * Return a new Context object for the current Context but whose storage
   4584      * APIs are backed by credential-protected storage. This is the default
   4585      * storage area for apps unless
   4586      * {@link android.R.attr#defaultToDeviceProtectedStorage} was requested.
   4587      * <p>
   4588      * On devices with direct boot, data stored in this location is encrypted
   4589      * with a key tied to user credentials, which can be accessed
   4590      * <em>only after</em> the user has entered their credentials (such as a
   4591      * lock pattern or PIN).
   4592      * <p>
   4593      * If the underlying device does not have the ability to store
   4594      * device-protected and credential-protected data using different keys, then
   4595      * both storage areas will become available at the same time. They remain as
   4596      * two distinct storage locations on disk, and only the window of
   4597      * availability changes.
   4598      * <p>
   4599      * Each call to this method returns a new instance of a Context object;
   4600      * Context objects are not shared, however common state (ClassLoader, other
   4601      * Resources for the same configuration) may be so the Context itself can be
   4602      * fairly lightweight.
   4603      *
   4604      * @see #isCredentialProtectedStorage()
   4605      * @hide
   4606      */
   4607     @SystemApi
   4608     public abstract Context createCredentialProtectedStorageContext();
   4609 
   4610     /**
   4611      * Gets the display adjustments holder for this context.  This information
   4612      * is provided on a per-application or activity basis and is used to simulate lower density
   4613      * display metrics for legacy applications and restricted screen sizes.
   4614      *
   4615      * @param displayId The display id for which to get compatibility info.
   4616      * @return The compatibility info holder, or null if not required by the application.
   4617      * @hide
   4618      */
   4619     public abstract DisplayAdjustments getDisplayAdjustments(int displayId);
   4620 
   4621     /**
   4622      * @hide
   4623      */
   4624     public abstract Display getDisplay();
   4625 
   4626     /**
   4627      * @hide
   4628      */
   4629     public abstract void updateDisplay(int displayId);
   4630 
   4631     /**
   4632      * Indicates whether this Context is restricted.
   4633      *
   4634      * @return {@code true} if this Context is restricted, {@code false} otherwise.
   4635      *
   4636      * @see #CONTEXT_RESTRICTED
   4637      */
   4638     public boolean isRestricted() {
   4639         return false;
   4640     }
   4641 
   4642     /**
   4643      * Indicates if the storage APIs of this Context are backed by
   4644      * device-protected storage.
   4645      *
   4646      * @see #createDeviceProtectedStorageContext()
   4647      */
   4648     public abstract boolean isDeviceProtectedStorage();
   4649 
   4650     /**
   4651      * Indicates if the storage APIs of this Context are backed by
   4652      * credential-protected storage.
   4653      *
   4654      * @see #createCredentialProtectedStorageContext()
   4655      * @hide
   4656      */
   4657     @SystemApi
   4658     public abstract boolean isCredentialProtectedStorage();
   4659 
   4660     /**
   4661      * Returns true if the context can load unsafe resources, e.g. fonts.
   4662      * @hide
   4663      */
   4664     public abstract boolean canLoadUnsafeResources();
   4665 
   4666     /**
   4667      * @hide
   4668      */
   4669     public IBinder getActivityToken() {
   4670         throw new RuntimeException("Not implemented. Must override in a subclass.");
   4671     }
   4672 
   4673     /**
   4674      * @hide
   4675      */
   4676     @Nullable
   4677     public IServiceConnection getServiceDispatcher(ServiceConnection conn, Handler handler,
   4678             int flags) {
   4679         throw new RuntimeException("Not implemented. Must override in a subclass.");
   4680     }
   4681 
   4682     /**
   4683      * @hide
   4684      */
   4685     public IApplicationThread getIApplicationThread() {
   4686         throw new RuntimeException("Not implemented. Must override in a subclass.");
   4687     }
   4688 
   4689     /**
   4690      * @hide
   4691      */
   4692     public Handler getMainThreadHandler() {
   4693         throw new RuntimeException("Not implemented. Must override in a subclass.");
   4694     }
   4695 
   4696     /**
   4697      * Throws an exception if the Context is using system resources,
   4698      * which are non-runtime-overlay-themable and may show inconsistent UI.
   4699      * @hide
   4700      */
   4701     public void assertRuntimeOverlayThemable() {
   4702         // Resources.getSystem() is a singleton and the only Resources not managed by
   4703         // ResourcesManager; therefore Resources.getSystem() is not themable.
   4704         if (getResources() == Resources.getSystem()) {
   4705             throw new IllegalArgumentException("Non-UI context used to display UI; "
   4706                     + "get a UI context from ActivityThread#getSystemUiContext()");
   4707         }
   4708     }
   4709 }
   4710