Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2007 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.app;
     18 
     19 import android.annotation.NonNull;
     20 import android.annotation.Nullable;
     21 import android.annotation.SystemApi;
     22 import android.graphics.Canvas;
     23 import android.graphics.Matrix;
     24 import android.graphics.Point;
     25 import android.os.BatteryStats;
     26 import android.os.IBinder;
     27 import android.os.ParcelFileDescriptor;
     28 
     29 import com.android.internal.app.ProcessStats;
     30 import com.android.internal.os.TransferPipe;
     31 import com.android.internal.util.FastPrintWriter;
     32 
     33 import android.content.ComponentName;
     34 import android.content.Context;
     35 import android.content.Intent;
     36 import android.content.pm.ApplicationInfo;
     37 import android.content.pm.ConfigurationInfo;
     38 import android.content.pm.IPackageDataObserver;
     39 import android.content.pm.PackageManager;
     40 import android.content.pm.UserInfo;
     41 import android.content.res.Resources;
     42 import android.graphics.Bitmap;
     43 import android.graphics.Color;
     44 import android.graphics.Rect;
     45 import android.os.Bundle;
     46 import android.os.Debug;
     47 import android.os.Handler;
     48 import android.os.Parcel;
     49 import android.os.Parcelable;
     50 import android.os.Process;
     51 import android.os.RemoteException;
     52 import android.os.ServiceManager;
     53 import android.os.SystemProperties;
     54 import android.os.UserHandle;
     55 import android.text.TextUtils;
     56 import android.util.DisplayMetrics;
     57 import android.util.Size;
     58 import android.util.Slog;
     59 import org.xmlpull.v1.XmlSerializer;
     60 
     61 import java.io.FileDescriptor;
     62 import java.io.FileOutputStream;
     63 import java.io.IOException;
     64 import java.io.PrintWriter;
     65 import java.util.ArrayList;
     66 import java.util.List;
     67 
     68 /**
     69  * Interact with the overall activities running in the system.
     70  */
     71 public class ActivityManager {
     72     private static String TAG = "ActivityManager";
     73     private static boolean localLOGV = false;
     74 
     75     private static int gMaxRecentTasks = -1;
     76 
     77     private final Context mContext;
     78     private final Handler mHandler;
     79 
     80     /**
     81      * <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code
     82      * &lt;meta-data>}</a> name for a 'home' Activity that declares a package that is to be
     83      * uninstalled in lieu of the declaring one.  The package named here must be
     84      * signed with the same certificate as the one declaring the {@code &lt;meta-data>}.
     85      */
     86     public static final String META_HOME_ALTERNATE = "android.app.home.alternate";
     87 
     88     /**
     89      * Result for IActivityManager.startActivity: trying to start an activity under voice
     90      * control when that activity does not support the VOICE category.
     91      * @hide
     92      */
     93     public static final int START_NOT_VOICE_COMPATIBLE = -7;
     94 
     95     /**
     96      * Result for IActivityManager.startActivity: an error where the
     97      * start had to be canceled.
     98      * @hide
     99      */
    100     public static final int START_CANCELED = -6;
    101 
    102     /**
    103      * Result for IActivityManager.startActivity: an error where the
    104      * thing being started is not an activity.
    105      * @hide
    106      */
    107     public static final int START_NOT_ACTIVITY = -5;
    108 
    109     /**
    110      * Result for IActivityManager.startActivity: an error where the
    111      * caller does not have permission to start the activity.
    112      * @hide
    113      */
    114     public static final int START_PERMISSION_DENIED = -4;
    115 
    116     /**
    117      * Result for IActivityManager.startActivity: an error where the
    118      * caller has requested both to forward a result and to receive
    119      * a result.
    120      * @hide
    121      */
    122     public static final int START_FORWARD_AND_REQUEST_CONFLICT = -3;
    123 
    124     /**
    125      * Result for IActivityManager.startActivity: an error where the
    126      * requested class is not found.
    127      * @hide
    128      */
    129     public static final int START_CLASS_NOT_FOUND = -2;
    130 
    131     /**
    132      * Result for IActivityManager.startActivity: an error where the
    133      * given Intent could not be resolved to an activity.
    134      * @hide
    135      */
    136     public static final int START_INTENT_NOT_RESOLVED = -1;
    137 
    138     /**
    139      * Result for IActivityManaqer.startActivity: the activity was started
    140      * successfully as normal.
    141      * @hide
    142      */
    143     public static final int START_SUCCESS = 0;
    144 
    145     /**
    146      * Result for IActivityManaqer.startActivity: the caller asked that the Intent not
    147      * be executed if it is the recipient, and that is indeed the case.
    148      * @hide
    149      */
    150     public static final int START_RETURN_INTENT_TO_CALLER = 1;
    151 
    152     /**
    153      * Result for IActivityManaqer.startActivity: activity wasn't really started, but
    154      * a task was simply brought to the foreground.
    155      * @hide
    156      */
    157     public static final int START_TASK_TO_FRONT = 2;
    158 
    159     /**
    160      * Result for IActivityManaqer.startActivity: activity wasn't really started, but
    161      * the given Intent was given to the existing top activity.
    162      * @hide
    163      */
    164     public static final int START_DELIVERED_TO_TOP = 3;
    165 
    166     /**
    167      * Result for IActivityManaqer.startActivity: request was canceled because
    168      * app switches are temporarily canceled to ensure the user's last request
    169      * (such as pressing home) is performed.
    170      * @hide
    171      */
    172     public static final int START_SWITCHES_CANCELED = 4;
    173 
    174     /**
    175      * Result for IActivityManaqer.startActivity: a new activity was attempted to be started
    176      * while in Lock Task Mode.
    177      * @hide
    178      */
    179     public static final int START_RETURN_LOCK_TASK_MODE_VIOLATION = 5;
    180 
    181     /**
    182      * Flag for IActivityManaqer.startActivity: do special start mode where
    183      * a new activity is launched only if it is needed.
    184      * @hide
    185      */
    186     public static final int START_FLAG_ONLY_IF_NEEDED = 1<<0;
    187 
    188     /**
    189      * Flag for IActivityManaqer.startActivity: launch the app for
    190      * debugging.
    191      * @hide
    192      */
    193     public static final int START_FLAG_DEBUG = 1<<1;
    194 
    195     /**
    196      * Flag for IActivityManaqer.startActivity: launch the app for
    197      * OpenGL tracing.
    198      * @hide
    199      */
    200     public static final int START_FLAG_OPENGL_TRACES = 1<<2;
    201 
    202     /**
    203      * Result for IActivityManaqer.broadcastIntent: success!
    204      * @hide
    205      */
    206     public static final int BROADCAST_SUCCESS = 0;
    207 
    208     /**
    209      * Result for IActivityManaqer.broadcastIntent: attempt to broadcast
    210      * a sticky intent without appropriate permission.
    211      * @hide
    212      */
    213     public static final int BROADCAST_STICKY_CANT_HAVE_PERMISSION = -1;
    214 
    215     /**
    216      * Result for IActivityManager.broadcastIntent: trying to send a broadcast
    217      * to a stopped user. Fail.
    218      * @hide
    219      */
    220     public static final int BROADCAST_FAILED_USER_STOPPED = -2;
    221 
    222     /**
    223      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    224      * for a sendBroadcast operation.
    225      * @hide
    226      */
    227     public static final int INTENT_SENDER_BROADCAST = 1;
    228 
    229     /**
    230      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    231      * for a startActivity operation.
    232      * @hide
    233      */
    234     public static final int INTENT_SENDER_ACTIVITY = 2;
    235 
    236     /**
    237      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    238      * for an activity result operation.
    239      * @hide
    240      */
    241     public static final int INTENT_SENDER_ACTIVITY_RESULT = 3;
    242 
    243     /**
    244      * Type for IActivityManaqer.getIntentSender: this PendingIntent is
    245      * for a startService operation.
    246      * @hide
    247      */
    248     public static final int INTENT_SENDER_SERVICE = 4;
    249 
    250     /** @hide User operation call: success! */
    251     public static final int USER_OP_SUCCESS = 0;
    252 
    253     /** @hide User operation call: given user id is not known. */
    254     public static final int USER_OP_UNKNOWN_USER = -1;
    255 
    256     /** @hide User operation call: given user id is the current user, can't be stopped. */
    257     public static final int USER_OP_IS_CURRENT = -2;
    258 
    259     /** @hide Process is a persistent system process. */
    260     public static final int PROCESS_STATE_PERSISTENT = 0;
    261 
    262     /** @hide Process is a persistent system process and is doing UI. */
    263     public static final int PROCESS_STATE_PERSISTENT_UI = 1;
    264 
    265     /** @hide Process is hosting the current top activities.  Note that this covers
    266      * all activities that are visible to the user. */
    267     public static final int PROCESS_STATE_TOP = 2;
    268 
    269     /** @hide Process is important to the user, and something they are aware of. */
    270     public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 3;
    271 
    272     /** @hide Process is important to the user, but not something they are aware of. */
    273     public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 4;
    274 
    275     /** @hide Process is in the background running a backup/restore operation. */
    276     public static final int PROCESS_STATE_BACKUP = 5;
    277 
    278     /** @hide Process is in the background, but it can't restore its state so we want
    279      * to try to avoid killing it. */
    280     public static final int PROCESS_STATE_HEAVY_WEIGHT = 6;
    281 
    282     /** @hide Process is in the background running a service.  Unlike oom_adj, this level
    283      * is used for both the normal running in background state and the executing
    284      * operations state. */
    285     public static final int PROCESS_STATE_SERVICE = 7;
    286 
    287     /** @hide Process is in the background running a receiver.   Note that from the
    288      * perspective of oom_adj receivers run at a higher foreground level, but for our
    289      * prioritization here that is not necessary and putting them below services means
    290      * many fewer changes in some process states as they receive broadcasts. */
    291     public static final int PROCESS_STATE_RECEIVER = 8;
    292 
    293     /** @hide Process is in the background but hosts the home activity. */
    294     public static final int PROCESS_STATE_HOME = 9;
    295 
    296     /** @hide Process is in the background but hosts the last shown activity. */
    297     public static final int PROCESS_STATE_LAST_ACTIVITY = 10;
    298 
    299     /** @hide Process is being cached for later use and contains activities. */
    300     public static final int PROCESS_STATE_CACHED_ACTIVITY = 11;
    301 
    302     /** @hide Process is being cached for later use and is a client of another cached
    303      * process that contains activities. */
    304     public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 12;
    305 
    306     /** @hide Process is being cached for later use and is empty. */
    307     public static final int PROCESS_STATE_CACHED_EMPTY = 13;
    308 
    309     Point mAppTaskThumbnailSize;
    310 
    311     /*package*/ ActivityManager(Context context, Handler handler) {
    312         mContext = context;
    313         mHandler = handler;
    314     }
    315 
    316     /**
    317      * Screen compatibility mode: the application most always run in
    318      * compatibility mode.
    319      * @hide
    320      */
    321     public static final int COMPAT_MODE_ALWAYS = -1;
    322 
    323     /**
    324      * Screen compatibility mode: the application can never run in
    325      * compatibility mode.
    326      * @hide
    327      */
    328     public static final int COMPAT_MODE_NEVER = -2;
    329 
    330     /**
    331      * Screen compatibility mode: unknown.
    332      * @hide
    333      */
    334     public static final int COMPAT_MODE_UNKNOWN = -3;
    335 
    336     /**
    337      * Screen compatibility mode: the application currently has compatibility
    338      * mode disabled.
    339      * @hide
    340      */
    341     public static final int COMPAT_MODE_DISABLED = 0;
    342 
    343     /**
    344      * Screen compatibility mode: the application currently has compatibility
    345      * mode enabled.
    346      * @hide
    347      */
    348     public static final int COMPAT_MODE_ENABLED = 1;
    349 
    350     /**
    351      * Screen compatibility mode: request to toggle the application's
    352      * compatibility mode.
    353      * @hide
    354      */
    355     public static final int COMPAT_MODE_TOGGLE = 2;
    356 
    357     /** @hide */
    358     public int getFrontActivityScreenCompatMode() {
    359         try {
    360             return ActivityManagerNative.getDefault().getFrontActivityScreenCompatMode();
    361         } catch (RemoteException e) {
    362             // System dead, we will be dead too soon!
    363             return 0;
    364         }
    365     }
    366 
    367     /** @hide */
    368     public void setFrontActivityScreenCompatMode(int mode) {
    369         try {
    370             ActivityManagerNative.getDefault().setFrontActivityScreenCompatMode(mode);
    371         } catch (RemoteException e) {
    372             // System dead, we will be dead too soon!
    373         }
    374     }
    375 
    376     /** @hide */
    377     public int getPackageScreenCompatMode(String packageName) {
    378         try {
    379             return ActivityManagerNative.getDefault().getPackageScreenCompatMode(packageName);
    380         } catch (RemoteException e) {
    381             // System dead, we will be dead too soon!
    382             return 0;
    383         }
    384     }
    385 
    386     /** @hide */
    387     public void setPackageScreenCompatMode(String packageName, int mode) {
    388         try {
    389             ActivityManagerNative.getDefault().setPackageScreenCompatMode(packageName, mode);
    390         } catch (RemoteException e) {
    391             // System dead, we will be dead too soon!
    392         }
    393     }
    394 
    395     /** @hide */
    396     public boolean getPackageAskScreenCompat(String packageName) {
    397         try {
    398             return ActivityManagerNative.getDefault().getPackageAskScreenCompat(packageName);
    399         } catch (RemoteException e) {
    400             // System dead, we will be dead too soon!
    401             return false;
    402         }
    403     }
    404 
    405     /** @hide */
    406     public void setPackageAskScreenCompat(String packageName, boolean ask) {
    407         try {
    408             ActivityManagerNative.getDefault().setPackageAskScreenCompat(packageName, ask);
    409         } catch (RemoteException e) {
    410             // System dead, we will be dead too soon!
    411         }
    412     }
    413 
    414     /**
    415      * Return the approximate per-application memory class of the current
    416      * device.  This gives you an idea of how hard a memory limit you should
    417      * impose on your application to let the overall system work best.  The
    418      * returned value is in megabytes; the baseline Android memory class is
    419      * 16 (which happens to be the Java heap limit of those devices); some
    420      * device with more memory may return 24 or even higher numbers.
    421      */
    422     public int getMemoryClass() {
    423         return staticGetMemoryClass();
    424     }
    425 
    426     /** @hide */
    427     static public int staticGetMemoryClass() {
    428         // Really brain dead right now -- just take this from the configured
    429         // vm heap size, and assume it is in megabytes and thus ends with "m".
    430         String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
    431         if (vmHeapSize != null && !"".equals(vmHeapSize)) {
    432             return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
    433         }
    434         return staticGetLargeMemoryClass();
    435     }
    436 
    437     /**
    438      * Return the approximate per-application memory class of the current
    439      * device when an application is running with a large heap.  This is the
    440      * space available for memory-intensive applications; most applications
    441      * should not need this amount of memory, and should instead stay with the
    442      * {@link #getMemoryClass()} limit.  The returned value is in megabytes.
    443      * This may be the same size as {@link #getMemoryClass()} on memory
    444      * constrained devices, or it may be significantly larger on devices with
    445      * a large amount of available RAM.
    446      *
    447      * <p>The is the size of the application's Dalvik heap if it has
    448      * specified <code>android:largeHeap="true"</code> in its manifest.
    449      */
    450     public int getLargeMemoryClass() {
    451         return staticGetLargeMemoryClass();
    452     }
    453 
    454     /** @hide */
    455     static public int staticGetLargeMemoryClass() {
    456         // Really brain dead right now -- just take this from the configured
    457         // vm heap size, and assume it is in megabytes and thus ends with "m".
    458         String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
    459         return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
    460     }
    461 
    462     /**
    463      * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
    464      * is ultimately up to the device configuration, but currently it generally means
    465      * something in the class of a 512MB device with about a 800x480 or less screen.
    466      * This is mostly intended to be used by apps to determine whether they should turn
    467      * off certain features that require more RAM.
    468      */
    469     public boolean isLowRamDevice() {
    470         return isLowRamDeviceStatic();
    471     }
    472 
    473     /** @hide */
    474     public static boolean isLowRamDeviceStatic() {
    475         return "true".equals(SystemProperties.get("ro.config.low_ram", "false"));
    476     }
    477 
    478     /**
    479      * Used by persistent processes to determine if they are running on a
    480      * higher-end device so should be okay using hardware drawing acceleration
    481      * (which tends to consume a lot more RAM).
    482      * @hide
    483      */
    484     static public boolean isHighEndGfx() {
    485         return !isLowRamDeviceStatic() &&
    486                 !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
    487     }
    488 
    489     /**
    490      * Return the maximum number of recents entries that we will maintain and show.
    491      * @hide
    492      */
    493     static public int getMaxRecentTasksStatic() {
    494         if (gMaxRecentTasks < 0) {
    495             return gMaxRecentTasks = isLowRamDeviceStatic() ? 50 : 100;
    496         }
    497         return gMaxRecentTasks;
    498     }
    499 
    500     /**
    501      * Return the default limit on the number of recents that an app can make.
    502      * @hide
    503      */
    504     static public int getDefaultAppRecentsLimitStatic() {
    505         return getMaxRecentTasksStatic() / 6;
    506     }
    507 
    508     /**
    509      * Return the maximum limit on the number of recents that an app can make.
    510      * @hide
    511      */
    512     static public int getMaxAppRecentsLimitStatic() {
    513         return getMaxRecentTasksStatic() / 2;
    514     }
    515 
    516     /**
    517      * Information you can set and retrieve about the current activity within the recent task list.
    518      */
    519     public static class TaskDescription implements Parcelable {
    520         /** @hide */
    521         public static final String ATTR_TASKDESCRIPTION_PREFIX = "task_description_";
    522         private static final String ATTR_TASKDESCRIPTIONLABEL =
    523                 ATTR_TASKDESCRIPTION_PREFIX + "label";
    524         private static final String ATTR_TASKDESCRIPTIONCOLOR =
    525                 ATTR_TASKDESCRIPTION_PREFIX + "color";
    526         private static final String ATTR_TASKDESCRIPTIONICONFILENAME =
    527                 ATTR_TASKDESCRIPTION_PREFIX + "icon_filename";
    528 
    529         private String mLabel;
    530         private Bitmap mIcon;
    531         private String mIconFilename;
    532         private int mColorPrimary;
    533 
    534         /**
    535          * Creates the TaskDescription to the specified values.
    536          *
    537          * @param label A label and description of the current state of this task.
    538          * @param icon An icon that represents the current state of this task.
    539          * @param colorPrimary A color to override the theme's primary color.  This color must be opaque.
    540          */
    541         public TaskDescription(String label, Bitmap icon, int colorPrimary) {
    542             if ((colorPrimary != 0) && (Color.alpha(colorPrimary) != 255)) {
    543                 throw new RuntimeException("A TaskDescription's primary color should be opaque");
    544             }
    545 
    546             mLabel = label;
    547             mIcon = icon;
    548             mColorPrimary = colorPrimary;
    549         }
    550 
    551         /** @hide */
    552         public TaskDescription(String label, int colorPrimary, String iconFilename) {
    553             this(label, null, colorPrimary);
    554             mIconFilename = iconFilename;
    555         }
    556 
    557         /**
    558          * Creates the TaskDescription to the specified values.
    559          *
    560          * @param label A label and description of the current state of this activity.
    561          * @param icon An icon that represents the current state of this activity.
    562          */
    563         public TaskDescription(String label, Bitmap icon) {
    564             this(label, icon, 0);
    565         }
    566 
    567         /**
    568          * Creates the TaskDescription to the specified values.
    569          *
    570          * @param label A label and description of the current state of this activity.
    571          */
    572         public TaskDescription(String label) {
    573             this(label, null, 0);
    574         }
    575 
    576         /**
    577          * Creates an empty TaskDescription.
    578          */
    579         public TaskDescription() {
    580             this(null, null, 0);
    581         }
    582 
    583         /**
    584          * Creates a copy of another TaskDescription.
    585          */
    586         public TaskDescription(TaskDescription td) {
    587             mLabel = td.mLabel;
    588             mIcon = td.mIcon;
    589             mColorPrimary = td.mColorPrimary;
    590             mIconFilename = td.mIconFilename;
    591         }
    592 
    593         private TaskDescription(Parcel source) {
    594             readFromParcel(source);
    595         }
    596 
    597         /**
    598          * Sets the label for this task description.
    599          * @hide
    600          */
    601         public void setLabel(String label) {
    602             mLabel = label;
    603         }
    604 
    605         /**
    606          * Sets the primary color for this task description.
    607          * @hide
    608          */
    609         public void setPrimaryColor(int primaryColor) {
    610             // Ensure that the given color is valid
    611             if ((primaryColor != 0) && (Color.alpha(primaryColor) != 255)) {
    612                 throw new RuntimeException("A TaskDescription's primary color should be opaque");
    613             }
    614             mColorPrimary = primaryColor;
    615         }
    616 
    617         /**
    618          * Sets the icon for this task description.
    619          * @hide
    620          */
    621         public void setIcon(Bitmap icon) {
    622             mIcon = icon;
    623         }
    624 
    625         /**
    626          * Moves the icon bitmap reference from an actual Bitmap to a file containing the
    627          * bitmap.
    628          * @hide
    629          */
    630         public void setIconFilename(String iconFilename) {
    631             mIconFilename = iconFilename;
    632             mIcon = null;
    633         }
    634 
    635         /**
    636          * @return The label and description of the current state of this task.
    637          */
    638         public String getLabel() {
    639             return mLabel;
    640         }
    641 
    642         /**
    643          * @return The icon that represents the current state of this task.
    644          */
    645         public Bitmap getIcon() {
    646             if (mIcon != null) {
    647                 return mIcon;
    648             }
    649             return loadTaskDescriptionIcon(mIconFilename);
    650         }
    651 
    652         /** @hide */
    653         public String getIconFilename() {
    654             return mIconFilename;
    655         }
    656 
    657         /** @hide */
    658         public Bitmap getInMemoryIcon() {
    659             return mIcon;
    660         }
    661 
    662         /** @hide */
    663         public static Bitmap loadTaskDescriptionIcon(String iconFilename) {
    664             if (iconFilename != null) {
    665                 try {
    666                     return ActivityManagerNative.getDefault().
    667                             getTaskDescriptionIcon(iconFilename);
    668                 } catch (RemoteException e) {
    669                 }
    670             }
    671             return null;
    672         }
    673 
    674         /**
    675          * @return The color override on the theme's primary color.
    676          */
    677         public int getPrimaryColor() {
    678             return mColorPrimary;
    679         }
    680 
    681         /** @hide */
    682         public void saveToXml(XmlSerializer out) throws IOException {
    683             if (mLabel != null) {
    684                 out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, mLabel);
    685             }
    686             if (mColorPrimary != 0) {
    687                 out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(mColorPrimary));
    688             }
    689             if (mIconFilename != null) {
    690                 out.attribute(null, ATTR_TASKDESCRIPTIONICONFILENAME, mIconFilename);
    691             }
    692         }
    693 
    694         /** @hide */
    695         public void restoreFromXml(String attrName, String attrValue) {
    696             if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) {
    697                 setLabel(attrValue);
    698             } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) {
    699                 setPrimaryColor((int) Long.parseLong(attrValue, 16));
    700             } else if (ATTR_TASKDESCRIPTIONICONFILENAME.equals(attrName)) {
    701                 setIconFilename(attrValue);
    702             }
    703         }
    704 
    705         @Override
    706         public int describeContents() {
    707             return 0;
    708         }
    709 
    710         @Override
    711         public void writeToParcel(Parcel dest, int flags) {
    712             if (mLabel == null) {
    713                 dest.writeInt(0);
    714             } else {
    715                 dest.writeInt(1);
    716                 dest.writeString(mLabel);
    717             }
    718             if (mIcon == null) {
    719                 dest.writeInt(0);
    720             } else {
    721                 dest.writeInt(1);
    722                 mIcon.writeToParcel(dest, 0);
    723             }
    724             dest.writeInt(mColorPrimary);
    725             if (mIconFilename == null) {
    726                 dest.writeInt(0);
    727             } else {
    728                 dest.writeInt(1);
    729                 dest.writeString(mIconFilename);
    730             }
    731         }
    732 
    733         public void readFromParcel(Parcel source) {
    734             mLabel = source.readInt() > 0 ? source.readString() : null;
    735             mIcon = source.readInt() > 0 ? Bitmap.CREATOR.createFromParcel(source) : null;
    736             mColorPrimary = source.readInt();
    737             mIconFilename = source.readInt() > 0 ? source.readString() : null;
    738         }
    739 
    740         public static final Creator<TaskDescription> CREATOR
    741                 = new Creator<TaskDescription>() {
    742             public TaskDescription createFromParcel(Parcel source) {
    743                 return new TaskDescription(source);
    744             }
    745             public TaskDescription[] newArray(int size) {
    746                 return new TaskDescription[size];
    747             }
    748         };
    749 
    750         @Override
    751         public String toString() {
    752             return "TaskDescription Label: " + mLabel + " Icon: " + mIcon +
    753                     " colorPrimary: " + mColorPrimary;
    754         }
    755     }
    756 
    757     /**
    758      * Information you can retrieve about tasks that the user has most recently
    759      * started or visited.
    760      */
    761     public static class RecentTaskInfo implements Parcelable {
    762         /**
    763          * If this task is currently running, this is the identifier for it.
    764          * If it is not running, this will be -1.
    765          */
    766         public int id;
    767 
    768         /**
    769          * The true identifier of this task, valid even if it is not running.
    770          */
    771         public int persistentId;
    772 
    773         /**
    774          * The original Intent used to launch the task.  You can use this
    775          * Intent to re-launch the task (if it is no longer running) or bring
    776          * the current task to the front.
    777          */
    778         public Intent baseIntent;
    779 
    780         /**
    781          * If this task was started from an alias, this is the actual
    782          * activity component that was initially started; the component of
    783          * the baseIntent in this case is the name of the actual activity
    784          * implementation that the alias referred to.  Otherwise, this is null.
    785          */
    786         public ComponentName origActivity;
    787 
    788         /**
    789          * Description of the task's last state.
    790          */
    791         public CharSequence description;
    792 
    793         /**
    794          * The id of the ActivityStack this Task was on most recently.
    795          * @hide
    796          */
    797         public int stackId;
    798 
    799         /**
    800          * The id of the user the task was running as.
    801          * @hide
    802          */
    803         public int userId;
    804 
    805         /**
    806          * The first time this task was active.
    807          * @hide
    808          */
    809         public long firstActiveTime;
    810 
    811         /**
    812          * The last time this task was active.
    813          * @hide
    814          */
    815         public long lastActiveTime;
    816 
    817         /**
    818          * The recent activity values for the highest activity in the stack to have set the values.
    819          * {@link Activity#setTaskDescription(android.app.ActivityManager.TaskDescription)}.
    820          */
    821         public TaskDescription taskDescription;
    822 
    823         /**
    824          * Task affiliation for grouping with other tasks.
    825          */
    826         public int affiliatedTaskId;
    827 
    828         /**
    829          * Task affiliation color of the source task with the affiliated task id.
    830          *
    831          * @hide
    832          */
    833         public int affiliatedTaskColor;
    834 
    835         public RecentTaskInfo() {
    836         }
    837 
    838         @Override
    839         public int describeContents() {
    840             return 0;
    841         }
    842 
    843         @Override
    844         public void writeToParcel(Parcel dest, int flags) {
    845             dest.writeInt(id);
    846             dest.writeInt(persistentId);
    847             if (baseIntent != null) {
    848                 dest.writeInt(1);
    849                 baseIntent.writeToParcel(dest, 0);
    850             } else {
    851                 dest.writeInt(0);
    852             }
    853             ComponentName.writeToParcel(origActivity, dest);
    854             TextUtils.writeToParcel(description, dest,
    855                     Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
    856             if (taskDescription != null) {
    857                 dest.writeInt(1);
    858                 taskDescription.writeToParcel(dest, 0);
    859             } else {
    860                 dest.writeInt(0);
    861             }
    862             dest.writeInt(stackId);
    863             dest.writeInt(userId);
    864             dest.writeLong(firstActiveTime);
    865             dest.writeLong(lastActiveTime);
    866             dest.writeInt(affiliatedTaskId);
    867             dest.writeInt(affiliatedTaskColor);
    868         }
    869 
    870         public void readFromParcel(Parcel source) {
    871             id = source.readInt();
    872             persistentId = source.readInt();
    873             baseIntent = source.readInt() > 0 ? Intent.CREATOR.createFromParcel(source) : null;
    874             origActivity = ComponentName.readFromParcel(source);
    875             description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
    876             taskDescription = source.readInt() > 0 ?
    877                     TaskDescription.CREATOR.createFromParcel(source) : null;
    878             stackId = source.readInt();
    879             userId = source.readInt();
    880             firstActiveTime = source.readLong();
    881             lastActiveTime = source.readLong();
    882             affiliatedTaskId = source.readInt();
    883             affiliatedTaskColor = source.readInt();
    884         }
    885 
    886         public static final Creator<RecentTaskInfo> CREATOR
    887                 = new Creator<RecentTaskInfo>() {
    888             public RecentTaskInfo createFromParcel(Parcel source) {
    889                 return new RecentTaskInfo(source);
    890             }
    891             public RecentTaskInfo[] newArray(int size) {
    892                 return new RecentTaskInfo[size];
    893             }
    894         };
    895 
    896         private RecentTaskInfo(Parcel source) {
    897             readFromParcel(source);
    898         }
    899     }
    900 
    901     /**
    902      * Flag for use with {@link #getRecentTasks}: return all tasks, even those
    903      * that have set their
    904      * {@link android.content.Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag.
    905      */
    906     public static final int RECENT_WITH_EXCLUDED = 0x0001;
    907 
    908     /**
    909      * Provides a list that does not contain any
    910      * recent tasks that currently are not available to the user.
    911      */
    912     public static final int RECENT_IGNORE_UNAVAILABLE = 0x0002;
    913 
    914     /**
    915      * Provides a list that contains recent tasks for all
    916      * profiles of a user.
    917      * @hide
    918      */
    919     public static final int RECENT_INCLUDE_PROFILES = 0x0004;
    920 
    921     /**
    922      * Ignores all tasks that are on the home stack.
    923      * @hide
    924      */
    925     public static final int RECENT_IGNORE_HOME_STACK_TASKS = 0x0008;
    926 
    927     /**
    928      * <p></p>Return a list of the tasks that the user has recently launched, with
    929      * the most recent being first and older ones after in order.
    930      *
    931      * <p><b>Note: this method is only intended for debugging and presenting
    932      * task management user interfaces</b>.  This should never be used for
    933      * core logic in an application, such as deciding between different
    934      * behaviors based on the information found here.  Such uses are
    935      * <em>not</em> supported, and will likely break in the future.  For
    936      * example, if multiple applications can be actively running at the
    937      * same time, assumptions made about the meaning of the data here for
    938      * purposes of control flow will be incorrect.</p>
    939      *
    940      * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method is
    941      * no longer available to third party applications: the introduction of
    942      * document-centric recents means
    943      * it can leak personal information to the caller.  For backwards compatibility,
    944      * it will still return a small subset of its data: at least the caller's
    945      * own tasks (though see {@link #getAppTasks()} for the correct supported
    946      * way to retrieve that information), and possibly some other tasks
    947      * such as home that are known to not be sensitive.
    948      *
    949      * @param maxNum The maximum number of entries to return in the list.  The
    950      * actual number returned may be smaller, depending on how many tasks the
    951      * user has started and the maximum number the system can remember.
    952      * @param flags Information about what to return.  May be any combination
    953      * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
    954      *
    955      * @return Returns a list of RecentTaskInfo records describing each of
    956      * the recent tasks.
    957      */
    958     @Deprecated
    959     public List<RecentTaskInfo> getRecentTasks(int maxNum, int flags)
    960             throws SecurityException {
    961         try {
    962             return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
    963                     flags, UserHandle.myUserId());
    964         } catch (RemoteException e) {
    965             // System dead, we will be dead too soon!
    966             return null;
    967         }
    968     }
    969 
    970     /**
    971      * Same as {@link #getRecentTasks(int, int)} but returns the recent tasks for a
    972      * specific user. It requires holding
    973      * the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
    974      * @param maxNum The maximum number of entries to return in the list.  The
    975      * actual number returned may be smaller, depending on how many tasks the
    976      * user has started and the maximum number the system can remember.
    977      * @param flags Information about what to return.  May be any combination
    978      * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}.
    979      *
    980      * @return Returns a list of RecentTaskInfo records describing each of
    981      * the recent tasks.
    982      *
    983      * @hide
    984      */
    985     public List<RecentTaskInfo> getRecentTasksForUser(int maxNum, int flags, int userId)
    986             throws SecurityException {
    987         try {
    988             return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
    989                     flags, userId);
    990         } catch (RemoteException e) {
    991             // System dead, we will be dead too soon!
    992             return null;
    993         }
    994     }
    995 
    996     /**
    997      * Information you can retrieve about a particular task that is currently
    998      * "running" in the system.  Note that a running task does not mean the
    999      * given task actually has a process it is actively running in; it simply
   1000      * means that the user has gone to it and never closed it, but currently
   1001      * the system may have killed its process and is only holding on to its
   1002      * last state in order to restart it when the user returns.
   1003      */
   1004     public static class RunningTaskInfo implements Parcelable {
   1005         /**
   1006          * A unique identifier for this task.
   1007          */
   1008         public int id;
   1009 
   1010         /**
   1011          * The component launched as the first activity in the task.  This can
   1012          * be considered the "application" of this task.
   1013          */
   1014         public ComponentName baseActivity;
   1015 
   1016         /**
   1017          * The activity component at the top of the history stack of the task.
   1018          * This is what the user is currently doing.
   1019          */
   1020         public ComponentName topActivity;
   1021 
   1022         /**
   1023          * Thumbnail representation of the task's current state.  Currently
   1024          * always null.
   1025          */
   1026         public Bitmap thumbnail;
   1027 
   1028         /**
   1029          * Description of the task's current state.
   1030          */
   1031         public CharSequence description;
   1032 
   1033         /**
   1034          * Number of activities in this task.
   1035          */
   1036         public int numActivities;
   1037 
   1038         /**
   1039          * Number of activities that are currently running (not stopped
   1040          * and persisted) in this task.
   1041          */
   1042         public int numRunning;
   1043 
   1044         /**
   1045          * Last time task was run. For sorting.
   1046          * @hide
   1047          */
   1048         public long lastActiveTime;
   1049 
   1050         public RunningTaskInfo() {
   1051         }
   1052 
   1053         public int describeContents() {
   1054             return 0;
   1055         }
   1056 
   1057         public void writeToParcel(Parcel dest, int flags) {
   1058             dest.writeInt(id);
   1059             ComponentName.writeToParcel(baseActivity, dest);
   1060             ComponentName.writeToParcel(topActivity, dest);
   1061             if (thumbnail != null) {
   1062                 dest.writeInt(1);
   1063                 thumbnail.writeToParcel(dest, 0);
   1064             } else {
   1065                 dest.writeInt(0);
   1066             }
   1067             TextUtils.writeToParcel(description, dest,
   1068                     Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1069             dest.writeInt(numActivities);
   1070             dest.writeInt(numRunning);
   1071         }
   1072 
   1073         public void readFromParcel(Parcel source) {
   1074             id = source.readInt();
   1075             baseActivity = ComponentName.readFromParcel(source);
   1076             topActivity = ComponentName.readFromParcel(source);
   1077             if (source.readInt() != 0) {
   1078                 thumbnail = Bitmap.CREATOR.createFromParcel(source);
   1079             } else {
   1080                 thumbnail = null;
   1081             }
   1082             description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
   1083             numActivities = source.readInt();
   1084             numRunning = source.readInt();
   1085         }
   1086 
   1087         public static final Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() {
   1088             public RunningTaskInfo createFromParcel(Parcel source) {
   1089                 return new RunningTaskInfo(source);
   1090             }
   1091             public RunningTaskInfo[] newArray(int size) {
   1092                 return new RunningTaskInfo[size];
   1093             }
   1094         };
   1095 
   1096         private RunningTaskInfo(Parcel source) {
   1097             readFromParcel(source);
   1098         }
   1099     }
   1100 
   1101     /**
   1102      * Get the list of tasks associated with the calling application.
   1103      *
   1104      * @return The list of tasks associated with the application making this call.
   1105      * @throws SecurityException
   1106      */
   1107     public List<ActivityManager.AppTask> getAppTasks() {
   1108         ArrayList<AppTask> tasks = new ArrayList<AppTask>();
   1109         List<IAppTask> appTasks;
   1110         try {
   1111             appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
   1112         } catch (RemoteException e) {
   1113             // System dead, we will be dead too soon!
   1114             return null;
   1115         }
   1116         int numAppTasks = appTasks.size();
   1117         for (int i = 0; i < numAppTasks; i++) {
   1118             tasks.add(new AppTask(appTasks.get(i)));
   1119         }
   1120         return tasks;
   1121     }
   1122 
   1123     /**
   1124      * Return the current design dimensions for {@link AppTask} thumbnails, for use
   1125      * with {@link #addAppTask}.
   1126      */
   1127     public Size getAppTaskThumbnailSize() {
   1128         synchronized (this) {
   1129             ensureAppTaskThumbnailSizeLocked();
   1130             return new Size(mAppTaskThumbnailSize.x, mAppTaskThumbnailSize.y);
   1131         }
   1132     }
   1133 
   1134     private void ensureAppTaskThumbnailSizeLocked() {
   1135         if (mAppTaskThumbnailSize == null) {
   1136             try {
   1137                 mAppTaskThumbnailSize = ActivityManagerNative.getDefault().getAppTaskThumbnailSize();
   1138             } catch (RemoteException e) {
   1139                 throw new IllegalStateException("System dead?", e);
   1140             }
   1141         }
   1142     }
   1143 
   1144     /**
   1145      * Add a new {@link AppTask} for the calling application.  This will create a new
   1146      * recents entry that is added to the <b>end</b> of all existing recents.
   1147      *
   1148      * @param activity The activity that is adding the entry.   This is used to help determine
   1149      * the context that the new recents entry will be in.
   1150      * @param intent The Intent that describes the recents entry.  This is the same Intent that
   1151      * you would have used to launch the activity for it.  In generally you will want to set
   1152      * both {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT} and
   1153      * {@link Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}; the latter is required since this recents
   1154      * entry will exist without an activity, so it doesn't make sense to not retain it when
   1155      * its activity disappears.  The given Intent here also must have an explicit ComponentName
   1156      * set on it.
   1157      * @param description Optional additional description information.
   1158      * @param thumbnail Thumbnail to use for the recents entry.  Should be the size given by
   1159      * {@link #getAppTaskThumbnailSize()}.  If the bitmap is not that exact size, it will be
   1160      * recreated in your process, probably in a way you don't like, before the recents entry
   1161      * is added.
   1162      *
   1163      * @return Returns the task id of the newly added app task, or -1 if the add failed.  The
   1164      * most likely cause of failure is that there is no more room for more tasks for your app.
   1165      */
   1166     public int addAppTask(@NonNull Activity activity, @NonNull Intent intent,
   1167             @Nullable TaskDescription description, @NonNull Bitmap thumbnail) {
   1168         Point size;
   1169         synchronized (this) {
   1170             ensureAppTaskThumbnailSizeLocked();
   1171             size = mAppTaskThumbnailSize;
   1172         }
   1173         final int tw = thumbnail.getWidth();
   1174         final int th = thumbnail.getHeight();
   1175         if (tw != size.x || th != size.y) {
   1176             Bitmap bm = Bitmap.createBitmap(size.x, size.y, thumbnail.getConfig());
   1177 
   1178             // Use ScaleType.CENTER_CROP, except we leave the top edge at the top.
   1179             float scale;
   1180             float dx = 0, dy = 0;
   1181             if (tw * size.x > size.y * th) {
   1182                 scale = (float) size.x / (float) th;
   1183                 dx = (size.y - tw * scale) * 0.5f;
   1184             } else {
   1185                 scale = (float) size.y / (float) tw;
   1186                 dy = (size.x - th * scale) * 0.5f;
   1187             }
   1188             Matrix matrix = new Matrix();
   1189             matrix.setScale(scale, scale);
   1190             matrix.postTranslate((int) (dx + 0.5f), 0);
   1191 
   1192             Canvas canvas = new Canvas(bm);
   1193             canvas.drawBitmap(thumbnail, matrix, null);
   1194             canvas.setBitmap(null);
   1195 
   1196             thumbnail = bm;
   1197         }
   1198         if (description == null) {
   1199             description = new TaskDescription();
   1200         }
   1201         try {
   1202             return ActivityManagerNative.getDefault().addAppTask(activity.getActivityToken(),
   1203                     intent, description, thumbnail);
   1204         } catch (RemoteException e) {
   1205             throw new IllegalStateException("System dead?", e);
   1206         }
   1207     }
   1208 
   1209     /**
   1210      * Return a list of the tasks that are currently running, with
   1211      * the most recent being first and older ones after in order.  Note that
   1212      * "running" does not mean any of the task's code is currently loaded or
   1213      * activity -- the task may have been frozen by the system, so that it
   1214      * can be restarted in its previous state when next brought to the
   1215      * foreground.
   1216      *
   1217      * <p><b>Note: this method is only intended for debugging and presenting
   1218      * task management user interfaces</b>.  This should never be used for
   1219      * core logic in an application, such as deciding between different
   1220      * behaviors based on the information found here.  Such uses are
   1221      * <em>not</em> supported, and will likely break in the future.  For
   1222      * example, if multiple applications can be actively running at the
   1223      * same time, assumptions made about the meaning of the data here for
   1224      * purposes of control flow will be incorrect.</p>
   1225      *
   1226      * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method
   1227      * is no longer available to third party
   1228      * applications: the introduction of document-centric recents means
   1229      * it can leak person information to the caller.  For backwards compatibility,
   1230      * it will still retu rn a small subset of its data: at least the caller's
   1231      * own tasks, and possibly some other tasks
   1232      * such as home that are known to not be sensitive.
   1233      *
   1234      * @param maxNum The maximum number of entries to return in the list.  The
   1235      * actual number returned may be smaller, depending on how many tasks the
   1236      * user has started.
   1237      *
   1238      * @return Returns a list of RunningTaskInfo records describing each of
   1239      * the running tasks.
   1240      */
   1241     @Deprecated
   1242     public List<RunningTaskInfo> getRunningTasks(int maxNum)
   1243             throws SecurityException {
   1244         try {
   1245             return ActivityManagerNative.getDefault().getTasks(maxNum, 0);
   1246         } catch (RemoteException e) {
   1247             // System dead, we will be dead too soon!
   1248             return null;
   1249         }
   1250     }
   1251 
   1252     /**
   1253      * Completely remove the given task.
   1254      *
   1255      * @param taskId Identifier of the task to be removed.
   1256      * @return Returns true if the given task was found and removed.
   1257      *
   1258      * @hide
   1259      */
   1260     public boolean removeTask(int taskId) throws SecurityException {
   1261         try {
   1262             return ActivityManagerNative.getDefault().removeTask(taskId);
   1263         } catch (RemoteException e) {
   1264             // System dead, we will be dead too soon!
   1265             return false;
   1266         }
   1267     }
   1268 
   1269     /** @hide */
   1270     public static class TaskThumbnail implements Parcelable {
   1271         public Bitmap mainThumbnail;
   1272         public ParcelFileDescriptor thumbnailFileDescriptor;
   1273 
   1274         public TaskThumbnail() {
   1275         }
   1276 
   1277         public int describeContents() {
   1278             if (thumbnailFileDescriptor != null) {
   1279                 return thumbnailFileDescriptor.describeContents();
   1280             }
   1281             return 0;
   1282         }
   1283 
   1284         public void writeToParcel(Parcel dest, int flags) {
   1285             if (mainThumbnail != null) {
   1286                 dest.writeInt(1);
   1287                 mainThumbnail.writeToParcel(dest, flags);
   1288             } else {
   1289                 dest.writeInt(0);
   1290             }
   1291             if (thumbnailFileDescriptor != null) {
   1292                 dest.writeInt(1);
   1293                 thumbnailFileDescriptor.writeToParcel(dest, flags);
   1294             } else {
   1295                 dest.writeInt(0);
   1296             }
   1297         }
   1298 
   1299         public void readFromParcel(Parcel source) {
   1300             if (source.readInt() != 0) {
   1301                 mainThumbnail = Bitmap.CREATOR.createFromParcel(source);
   1302             } else {
   1303                 mainThumbnail = null;
   1304             }
   1305             if (source.readInt() != 0) {
   1306                 thumbnailFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(source);
   1307             } else {
   1308                 thumbnailFileDescriptor = null;
   1309             }
   1310         }
   1311 
   1312         public static final Creator<TaskThumbnail> CREATOR = new Creator<TaskThumbnail>() {
   1313             public TaskThumbnail createFromParcel(Parcel source) {
   1314                 return new TaskThumbnail(source);
   1315             }
   1316             public TaskThumbnail[] newArray(int size) {
   1317                 return new TaskThumbnail[size];
   1318             }
   1319         };
   1320 
   1321         private TaskThumbnail(Parcel source) {
   1322             readFromParcel(source);
   1323         }
   1324     }
   1325 
   1326     /** @hide */
   1327     public TaskThumbnail getTaskThumbnail(int id) throws SecurityException {
   1328         try {
   1329             return ActivityManagerNative.getDefault().getTaskThumbnail(id);
   1330         } catch (RemoteException e) {
   1331             // System dead, we will be dead too soon!
   1332             return null;
   1333         }
   1334     }
   1335 
   1336     /** @hide */
   1337     public boolean isInHomeStack(int taskId) {
   1338         try {
   1339             return ActivityManagerNative.getDefault().isInHomeStack(taskId);
   1340         } catch (RemoteException e) {
   1341             // System dead, we will be dead too soon!
   1342             return false;
   1343         }
   1344     }
   1345 
   1346     /**
   1347      * Flag for {@link #moveTaskToFront(int, int)}: also move the "home"
   1348      * activity along with the task, so it is positioned immediately behind
   1349      * the task.
   1350      */
   1351     public static final int MOVE_TASK_WITH_HOME = 0x00000001;
   1352 
   1353     /**
   1354      * Flag for {@link #moveTaskToFront(int, int)}: don't count this as a
   1355      * user-instigated action, so the current activity will not receive a
   1356      * hint that the user is leaving.
   1357      */
   1358     public static final int MOVE_TASK_NO_USER_ACTION = 0x00000002;
   1359 
   1360     /**
   1361      * Equivalent to calling {@link #moveTaskToFront(int, int, Bundle)}
   1362      * with a null options argument.
   1363      *
   1364      * @param taskId The identifier of the task to be moved, as found in
   1365      * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
   1366      * @param flags Additional operational flags, 0 or more of
   1367      * {@link #MOVE_TASK_WITH_HOME}, {@link #MOVE_TASK_NO_USER_ACTION}.
   1368      */
   1369     public void moveTaskToFront(int taskId, int flags) {
   1370         moveTaskToFront(taskId, flags, null);
   1371     }
   1372 
   1373     /**
   1374      * Ask that the task associated with a given task ID be moved to the
   1375      * front of the stack, so it is now visible to the user.  Requires that
   1376      * the caller hold permission {@link android.Manifest.permission#REORDER_TASKS}
   1377      * or a SecurityException will be thrown.
   1378      *
   1379      * @param taskId The identifier of the task to be moved, as found in
   1380      * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
   1381      * @param flags Additional operational flags, 0 or more of
   1382      * {@link #MOVE_TASK_WITH_HOME}, {@link #MOVE_TASK_NO_USER_ACTION}.
   1383      * @param options Additional options for the operation, either null or
   1384      * as per {@link Context#startActivity(Intent, android.os.Bundle)
   1385      * Context.startActivity(Intent, Bundle)}.
   1386      */
   1387     public void moveTaskToFront(int taskId, int flags, Bundle options) {
   1388         try {
   1389             ActivityManagerNative.getDefault().moveTaskToFront(taskId, flags, options);
   1390         } catch (RemoteException e) {
   1391             // System dead, we will be dead too soon!
   1392         }
   1393     }
   1394 
   1395     /**
   1396      * Information you can retrieve about a particular Service that is
   1397      * currently running in the system.
   1398      */
   1399     public static class RunningServiceInfo implements Parcelable {
   1400         /**
   1401          * The service component.
   1402          */
   1403         public ComponentName service;
   1404 
   1405         /**
   1406          * If non-zero, this is the process the service is running in.
   1407          */
   1408         public int pid;
   1409 
   1410         /**
   1411          * The UID that owns this service.
   1412          */
   1413         public int uid;
   1414 
   1415         /**
   1416          * The name of the process this service runs in.
   1417          */
   1418         public String process;
   1419 
   1420         /**
   1421          * Set to true if the service has asked to run as a foreground process.
   1422          */
   1423         public boolean foreground;
   1424 
   1425         /**
   1426          * The time when the service was first made active, either by someone
   1427          * starting or binding to it.  This
   1428          * is in units of {@link android.os.SystemClock#elapsedRealtime()}.
   1429          */
   1430         public long activeSince;
   1431 
   1432         /**
   1433          * Set to true if this service has been explicitly started.
   1434          */
   1435         public boolean started;
   1436 
   1437         /**
   1438          * Number of clients connected to the service.
   1439          */
   1440         public int clientCount;
   1441 
   1442         /**
   1443          * Number of times the service's process has crashed while the service
   1444          * is running.
   1445          */
   1446         public int crashCount;
   1447 
   1448         /**
   1449          * The time when there was last activity in the service (either
   1450          * explicit requests to start it or clients binding to it).  This
   1451          * is in units of {@link android.os.SystemClock#uptimeMillis()}.
   1452          */
   1453         public long lastActivityTime;
   1454 
   1455         /**
   1456          * If non-zero, this service is not currently running, but scheduled to
   1457          * restart at the given time.
   1458          */
   1459         public long restarting;
   1460 
   1461         /**
   1462          * Bit for {@link #flags}: set if this service has been
   1463          * explicitly started.
   1464          */
   1465         public static final int FLAG_STARTED = 1<<0;
   1466 
   1467         /**
   1468          * Bit for {@link #flags}: set if the service has asked to
   1469          * run as a foreground process.
   1470          */
   1471         public static final int FLAG_FOREGROUND = 1<<1;
   1472 
   1473         /**
   1474          * Bit for {@link #flags): set if the service is running in a
   1475          * core system process.
   1476          */
   1477         public static final int FLAG_SYSTEM_PROCESS = 1<<2;
   1478 
   1479         /**
   1480          * Bit for {@link #flags): set if the service is running in a
   1481          * persistent process.
   1482          */
   1483         public static final int FLAG_PERSISTENT_PROCESS = 1<<3;
   1484 
   1485         /**
   1486          * Running flags.
   1487          */
   1488         public int flags;
   1489 
   1490         /**
   1491          * For special services that are bound to by system code, this is
   1492          * the package that holds the binding.
   1493          */
   1494         public String clientPackage;
   1495 
   1496         /**
   1497          * For special services that are bound to by system code, this is
   1498          * a string resource providing a user-visible label for who the
   1499          * client is.
   1500          */
   1501         public int clientLabel;
   1502 
   1503         public RunningServiceInfo() {
   1504         }
   1505 
   1506         public int describeContents() {
   1507             return 0;
   1508         }
   1509 
   1510         public void writeToParcel(Parcel dest, int flags) {
   1511             ComponentName.writeToParcel(service, dest);
   1512             dest.writeInt(pid);
   1513             dest.writeInt(uid);
   1514             dest.writeString(process);
   1515             dest.writeInt(foreground ? 1 : 0);
   1516             dest.writeLong(activeSince);
   1517             dest.writeInt(started ? 1 : 0);
   1518             dest.writeInt(clientCount);
   1519             dest.writeInt(crashCount);
   1520             dest.writeLong(lastActivityTime);
   1521             dest.writeLong(restarting);
   1522             dest.writeInt(this.flags);
   1523             dest.writeString(clientPackage);
   1524             dest.writeInt(clientLabel);
   1525         }
   1526 
   1527         public void readFromParcel(Parcel source) {
   1528             service = ComponentName.readFromParcel(source);
   1529             pid = source.readInt();
   1530             uid = source.readInt();
   1531             process = source.readString();
   1532             foreground = source.readInt() != 0;
   1533             activeSince = source.readLong();
   1534             started = source.readInt() != 0;
   1535             clientCount = source.readInt();
   1536             crashCount = source.readInt();
   1537             lastActivityTime = source.readLong();
   1538             restarting = source.readLong();
   1539             flags = source.readInt();
   1540             clientPackage = source.readString();
   1541             clientLabel = source.readInt();
   1542         }
   1543 
   1544         public static final Creator<RunningServiceInfo> CREATOR = new Creator<RunningServiceInfo>() {
   1545             public RunningServiceInfo createFromParcel(Parcel source) {
   1546                 return new RunningServiceInfo(source);
   1547             }
   1548             public RunningServiceInfo[] newArray(int size) {
   1549                 return new RunningServiceInfo[size];
   1550             }
   1551         };
   1552 
   1553         private RunningServiceInfo(Parcel source) {
   1554             readFromParcel(source);
   1555         }
   1556     }
   1557 
   1558     /**
   1559      * Return a list of the services that are currently running.
   1560      *
   1561      * <p><b>Note: this method is only intended for debugging or implementing
   1562      * service management type user interfaces.</b></p>
   1563      *
   1564      * @param maxNum The maximum number of entries to return in the list.  The
   1565      * actual number returned may be smaller, depending on how many services
   1566      * are running.
   1567      *
   1568      * @return Returns a list of RunningServiceInfo records describing each of
   1569      * the running tasks.
   1570      */
   1571     public List<RunningServiceInfo> getRunningServices(int maxNum)
   1572             throws SecurityException {
   1573         try {
   1574             return ActivityManagerNative.getDefault()
   1575                     .getServices(maxNum, 0);
   1576         } catch (RemoteException e) {
   1577             // System dead, we will be dead too soon!
   1578             return null;
   1579         }
   1580     }
   1581 
   1582     /**
   1583      * Returns a PendingIntent you can start to show a control panel for the
   1584      * given running service.  If the service does not have a control panel,
   1585      * null is returned.
   1586      */
   1587     public PendingIntent getRunningServiceControlPanel(ComponentName service)
   1588             throws SecurityException {
   1589         try {
   1590             return ActivityManagerNative.getDefault()
   1591                     .getRunningServiceControlPanel(service);
   1592         } catch (RemoteException e) {
   1593             // System dead, we will be dead too soon!
   1594             return null;
   1595         }
   1596     }
   1597 
   1598     /**
   1599      * Information you can retrieve about the available memory through
   1600      * {@link ActivityManager#getMemoryInfo}.
   1601      */
   1602     public static class MemoryInfo implements Parcelable {
   1603         /**
   1604          * The available memory on the system.  This number should not
   1605          * be considered absolute: due to the nature of the kernel, a significant
   1606          * portion of this memory is actually in use and needed for the overall
   1607          * system to run well.
   1608          */
   1609         public long availMem;
   1610 
   1611         /**
   1612          * The total memory accessible by the kernel.  This is basically the
   1613          * RAM size of the device, not including below-kernel fixed allocations
   1614          * like DMA buffers, RAM for the baseband CPU, etc.
   1615          */
   1616         public long totalMem;
   1617 
   1618         /**
   1619          * The threshold of {@link #availMem} at which we consider memory to be
   1620          * low and start killing background services and other non-extraneous
   1621          * processes.
   1622          */
   1623         public long threshold;
   1624 
   1625         /**
   1626          * Set to true if the system considers itself to currently be in a low
   1627          * memory situation.
   1628          */
   1629         public boolean lowMemory;
   1630 
   1631         /** @hide */
   1632         public long hiddenAppThreshold;
   1633         /** @hide */
   1634         public long secondaryServerThreshold;
   1635         /** @hide */
   1636         public long visibleAppThreshold;
   1637         /** @hide */
   1638         public long foregroundAppThreshold;
   1639 
   1640         public MemoryInfo() {
   1641         }
   1642 
   1643         public int describeContents() {
   1644             return 0;
   1645         }
   1646 
   1647         public void writeToParcel(Parcel dest, int flags) {
   1648             dest.writeLong(availMem);
   1649             dest.writeLong(totalMem);
   1650             dest.writeLong(threshold);
   1651             dest.writeInt(lowMemory ? 1 : 0);
   1652             dest.writeLong(hiddenAppThreshold);
   1653             dest.writeLong(secondaryServerThreshold);
   1654             dest.writeLong(visibleAppThreshold);
   1655             dest.writeLong(foregroundAppThreshold);
   1656         }
   1657 
   1658         public void readFromParcel(Parcel source) {
   1659             availMem = source.readLong();
   1660             totalMem = source.readLong();
   1661             threshold = source.readLong();
   1662             lowMemory = source.readInt() != 0;
   1663             hiddenAppThreshold = source.readLong();
   1664             secondaryServerThreshold = source.readLong();
   1665             visibleAppThreshold = source.readLong();
   1666             foregroundAppThreshold = source.readLong();
   1667         }
   1668 
   1669         public static final Creator<MemoryInfo> CREATOR
   1670                 = new Creator<MemoryInfo>() {
   1671             public MemoryInfo createFromParcel(Parcel source) {
   1672                 return new MemoryInfo(source);
   1673             }
   1674             public MemoryInfo[] newArray(int size) {
   1675                 return new MemoryInfo[size];
   1676             }
   1677         };
   1678 
   1679         private MemoryInfo(Parcel source) {
   1680             readFromParcel(source);
   1681         }
   1682     }
   1683 
   1684     /**
   1685      * Return general information about the memory state of the system.  This
   1686      * can be used to help decide how to manage your own memory, though note
   1687      * that polling is not recommended and
   1688      * {@link android.content.ComponentCallbacks2#onTrimMemory(int)
   1689      * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this.
   1690      * Also see {@link #getMyMemoryState} for how to retrieve the current trim
   1691      * level of your process as needed, which gives a better hint for how to
   1692      * manage its memory.
   1693      */
   1694     public void getMemoryInfo(MemoryInfo outInfo) {
   1695         try {
   1696             ActivityManagerNative.getDefault().getMemoryInfo(outInfo);
   1697         } catch (RemoteException e) {
   1698         }
   1699     }
   1700 
   1701     /**
   1702      * Information you can retrieve about an ActivityStack in the system.
   1703      * @hide
   1704      */
   1705     public static class StackInfo implements Parcelable {
   1706         public int stackId;
   1707         public Rect bounds = new Rect();
   1708         public int[] taskIds;
   1709         public String[] taskNames;
   1710         public int displayId;
   1711 
   1712         @Override
   1713         public int describeContents() {
   1714             return 0;
   1715         }
   1716 
   1717         @Override
   1718         public void writeToParcel(Parcel dest, int flags) {
   1719             dest.writeInt(stackId);
   1720             dest.writeInt(bounds.left);
   1721             dest.writeInt(bounds.top);
   1722             dest.writeInt(bounds.right);
   1723             dest.writeInt(bounds.bottom);
   1724             dest.writeIntArray(taskIds);
   1725             dest.writeStringArray(taskNames);
   1726             dest.writeInt(displayId);
   1727         }
   1728 
   1729         public void readFromParcel(Parcel source) {
   1730             stackId = source.readInt();
   1731             bounds = new Rect(
   1732                     source.readInt(), source.readInt(), source.readInt(), source.readInt());
   1733             taskIds = source.createIntArray();
   1734             taskNames = source.createStringArray();
   1735             displayId = source.readInt();
   1736         }
   1737 
   1738         public static final Creator<StackInfo> CREATOR = new Creator<StackInfo>() {
   1739             @Override
   1740             public StackInfo createFromParcel(Parcel source) {
   1741                 return new StackInfo(source);
   1742             }
   1743             @Override
   1744             public StackInfo[] newArray(int size) {
   1745                 return new StackInfo[size];
   1746             }
   1747         };
   1748 
   1749         public StackInfo() {
   1750         }
   1751 
   1752         private StackInfo(Parcel source) {
   1753             readFromParcel(source);
   1754         }
   1755 
   1756         public String toString(String prefix) {
   1757             StringBuilder sb = new StringBuilder(256);
   1758             sb.append(prefix); sb.append("Stack id="); sb.append(stackId);
   1759                     sb.append(" bounds="); sb.append(bounds.toShortString());
   1760                     sb.append(" displayId="); sb.append(displayId);
   1761                     sb.append("\n");
   1762             prefix = prefix + "  ";
   1763             for (int i = 0; i < taskIds.length; ++i) {
   1764                 sb.append(prefix); sb.append("taskId="); sb.append(taskIds[i]);
   1765                         sb.append(": "); sb.append(taskNames[i]); sb.append("\n");
   1766             }
   1767             return sb.toString();
   1768         }
   1769 
   1770         @Override
   1771         public String toString() {
   1772             return toString("");
   1773         }
   1774     }
   1775 
   1776     /**
   1777      * @hide
   1778      */
   1779     public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
   1780         try {
   1781             return ActivityManagerNative.getDefault().clearApplicationUserData(packageName,
   1782                     observer, UserHandle.myUserId());
   1783         } catch (RemoteException e) {
   1784             return false;
   1785         }
   1786     }
   1787 
   1788     /**
   1789      * Permits an application to erase its own data from disk.  This is equivalent to
   1790      * the user choosing to clear the app's data from within the device settings UI.  It
   1791      * erases all dynamic data associated with the app -- its private data and data in its
   1792      * private area on external storage -- but does not remove the installed application
   1793      * itself, nor any OBB files.
   1794      *
   1795      * @return {@code true} if the application successfully requested that the application's
   1796      *     data be erased; {@code false} otherwise.
   1797      */
   1798     public boolean clearApplicationUserData() {
   1799         return clearApplicationUserData(mContext.getPackageName(), null);
   1800     }
   1801 
   1802     /**
   1803      * Information you can retrieve about any processes that are in an error condition.
   1804      */
   1805     public static class ProcessErrorStateInfo implements Parcelable {
   1806         /**
   1807          * Condition codes
   1808          */
   1809         public static final int NO_ERROR = 0;
   1810         public static final int CRASHED = 1;
   1811         public static final int NOT_RESPONDING = 2;
   1812 
   1813         /**
   1814          * The condition that the process is in.
   1815          */
   1816         public int condition;
   1817 
   1818         /**
   1819          * The process name in which the crash or error occurred.
   1820          */
   1821         public String processName;
   1822 
   1823         /**
   1824          * The pid of this process; 0 if none
   1825          */
   1826         public int pid;
   1827 
   1828         /**
   1829          * The kernel user-ID that has been assigned to this process;
   1830          * currently this is not a unique ID (multiple applications can have
   1831          * the same uid).
   1832          */
   1833         public int uid;
   1834 
   1835         /**
   1836          * The activity name associated with the error, if known.  May be null.
   1837          */
   1838         public String tag;
   1839 
   1840         /**
   1841          * A short message describing the error condition.
   1842          */
   1843         public String shortMsg;
   1844 
   1845         /**
   1846          * A long message describing the error condition.
   1847          */
   1848         public String longMsg;
   1849 
   1850         /**
   1851          * The stack trace where the error originated.  May be null.
   1852          */
   1853         public String stackTrace;
   1854 
   1855         /**
   1856          * to be deprecated: This value will always be null.
   1857          */
   1858         public byte[] crashData = null;
   1859 
   1860         public ProcessErrorStateInfo() {
   1861         }
   1862 
   1863         @Override
   1864         public int describeContents() {
   1865             return 0;
   1866         }
   1867 
   1868         @Override
   1869         public void writeToParcel(Parcel dest, int flags) {
   1870             dest.writeInt(condition);
   1871             dest.writeString(processName);
   1872             dest.writeInt(pid);
   1873             dest.writeInt(uid);
   1874             dest.writeString(tag);
   1875             dest.writeString(shortMsg);
   1876             dest.writeString(longMsg);
   1877             dest.writeString(stackTrace);
   1878         }
   1879 
   1880         public void readFromParcel(Parcel source) {
   1881             condition = source.readInt();
   1882             processName = source.readString();
   1883             pid = source.readInt();
   1884             uid = source.readInt();
   1885             tag = source.readString();
   1886             shortMsg = source.readString();
   1887             longMsg = source.readString();
   1888             stackTrace = source.readString();
   1889         }
   1890 
   1891         public static final Creator<ProcessErrorStateInfo> CREATOR =
   1892                 new Creator<ProcessErrorStateInfo>() {
   1893             public ProcessErrorStateInfo createFromParcel(Parcel source) {
   1894                 return new ProcessErrorStateInfo(source);
   1895             }
   1896             public ProcessErrorStateInfo[] newArray(int size) {
   1897                 return new ProcessErrorStateInfo[size];
   1898             }
   1899         };
   1900 
   1901         private ProcessErrorStateInfo(Parcel source) {
   1902             readFromParcel(source);
   1903         }
   1904     }
   1905 
   1906     /**
   1907      * Returns a list of any processes that are currently in an error condition.  The result
   1908      * will be null if all processes are running properly at this time.
   1909      *
   1910      * @return Returns a list of ProcessErrorStateInfo records, or null if there are no
   1911      * current error conditions (it will not return an empty list).  This list ordering is not
   1912      * specified.
   1913      */
   1914     public List<ProcessErrorStateInfo> getProcessesInErrorState() {
   1915         try {
   1916             return ActivityManagerNative.getDefault().getProcessesInErrorState();
   1917         } catch (RemoteException e) {
   1918             return null;
   1919         }
   1920     }
   1921 
   1922     /**
   1923      * Information you can retrieve about a running process.
   1924      */
   1925     public static class RunningAppProcessInfo implements Parcelable {
   1926         /**
   1927          * The name of the process that this object is associated with
   1928          */
   1929         public String processName;
   1930 
   1931         /**
   1932          * The pid of this process; 0 if none
   1933          */
   1934         public int pid;
   1935 
   1936         /**
   1937          * The user id of this process.
   1938          */
   1939         public int uid;
   1940 
   1941         /**
   1942          * All packages that have been loaded into the process.
   1943          */
   1944         public String pkgList[];
   1945 
   1946         /**
   1947          * Constant for {@link #flags}: this is an app that is unable to
   1948          * correctly save its state when going to the background,
   1949          * so it can not be killed while in the background.
   1950          * @hide
   1951          */
   1952         public static final int FLAG_CANT_SAVE_STATE = 1<<0;
   1953 
   1954         /**
   1955          * Constant for {@link #flags}: this process is associated with a
   1956          * persistent system app.
   1957          * @hide
   1958          */
   1959         public static final int FLAG_PERSISTENT = 1<<1;
   1960 
   1961         /**
   1962          * Constant for {@link #flags}: this process is associated with a
   1963          * persistent system app.
   1964          * @hide
   1965          */
   1966         public static final int FLAG_HAS_ACTIVITIES = 1<<2;
   1967 
   1968         /**
   1969          * Flags of information.  May be any of
   1970          * {@link #FLAG_CANT_SAVE_STATE}.
   1971          * @hide
   1972          */
   1973         public int flags;
   1974 
   1975         /**
   1976          * Last memory trim level reported to the process: corresponds to
   1977          * the values supplied to {@link android.content.ComponentCallbacks2#onTrimMemory(int)
   1978          * ComponentCallbacks2.onTrimMemory(int)}.
   1979          */
   1980         public int lastTrimLevel;
   1981 
   1982         /**
   1983          * Constant for {@link #importance}: this process is running the
   1984          * foreground UI.
   1985          */
   1986         public static final int IMPORTANCE_FOREGROUND = 100;
   1987 
   1988         /**
   1989          * Constant for {@link #importance}: this process is running something
   1990          * that is actively visible to the user, though not in the immediate
   1991          * foreground.
   1992          */
   1993         public static final int IMPORTANCE_VISIBLE = 200;
   1994 
   1995         /**
   1996          * Constant for {@link #importance}: this process is running something
   1997          * that is considered to be actively perceptible to the user.  An
   1998          * example would be an application performing background music playback.
   1999          */
   2000         public static final int IMPORTANCE_PERCEPTIBLE = 130;
   2001 
   2002         /**
   2003          * Constant for {@link #importance}: this process is running an
   2004          * application that can not save its state, and thus can't be killed
   2005          * while in the background.
   2006          * @hide
   2007          */
   2008         public static final int IMPORTANCE_CANT_SAVE_STATE = 170;
   2009 
   2010         /**
   2011          * Constant for {@link #importance}: this process is contains services
   2012          * that should remain running.
   2013          */
   2014         public static final int IMPORTANCE_SERVICE = 300;
   2015 
   2016         /**
   2017          * Constant for {@link #importance}: this process process contains
   2018          * background code that is expendable.
   2019          */
   2020         public static final int IMPORTANCE_BACKGROUND = 400;
   2021 
   2022         /**
   2023          * Constant for {@link #importance}: this process is empty of any
   2024          * actively running code.
   2025          */
   2026         public static final int IMPORTANCE_EMPTY = 500;
   2027 
   2028         /**
   2029          * Constant for {@link #importance}: this process does not exist.
   2030          */
   2031         public static final int IMPORTANCE_GONE = 1000;
   2032 
   2033         /** @hide */
   2034         public static int procStateToImportance(int procState) {
   2035             if (procState >= ActivityManager.PROCESS_STATE_HOME) {
   2036                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
   2037             } else if (procState >= ActivityManager.PROCESS_STATE_SERVICE) {
   2038                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
   2039             } else if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
   2040                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE;
   2041             } else if (procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
   2042                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE;
   2043             } else if (procState >= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
   2044                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
   2045             } else {
   2046                 return ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
   2047             }
   2048         }
   2049 
   2050         /**
   2051          * The relative importance level that the system places on this
   2052          * process.  May be one of {@link #IMPORTANCE_FOREGROUND},
   2053          * {@link #IMPORTANCE_VISIBLE}, {@link #IMPORTANCE_SERVICE},
   2054          * {@link #IMPORTANCE_BACKGROUND}, or {@link #IMPORTANCE_EMPTY}.  These
   2055          * constants are numbered so that "more important" values are always
   2056          * smaller than "less important" values.
   2057          */
   2058         public int importance;
   2059 
   2060         /**
   2061          * An additional ordering within a particular {@link #importance}
   2062          * category, providing finer-grained information about the relative
   2063          * utility of processes within a category.  This number means nothing
   2064          * except that a smaller values are more recently used (and thus
   2065          * more important).  Currently an LRU value is only maintained for
   2066          * the {@link #IMPORTANCE_BACKGROUND} category, though others may
   2067          * be maintained in the future.
   2068          */
   2069         public int lru;
   2070 
   2071         /**
   2072          * Constant for {@link #importanceReasonCode}: nothing special has
   2073          * been specified for the reason for this level.
   2074          */
   2075         public static final int REASON_UNKNOWN = 0;
   2076 
   2077         /**
   2078          * Constant for {@link #importanceReasonCode}: one of the application's
   2079          * content providers is being used by another process.  The pid of
   2080          * the client process is in {@link #importanceReasonPid} and the
   2081          * target provider in this process is in
   2082          * {@link #importanceReasonComponent}.
   2083          */
   2084         public static final int REASON_PROVIDER_IN_USE = 1;
   2085 
   2086         /**
   2087          * Constant for {@link #importanceReasonCode}: one of the application's
   2088          * content providers is being used by another process.  The pid of
   2089          * the client process is in {@link #importanceReasonPid} and the
   2090          * target provider in this process is in
   2091          * {@link #importanceReasonComponent}.
   2092          */
   2093         public static final int REASON_SERVICE_IN_USE = 2;
   2094 
   2095         /**
   2096          * The reason for {@link #importance}, if any.
   2097          */
   2098         public int importanceReasonCode;
   2099 
   2100         /**
   2101          * For the specified values of {@link #importanceReasonCode}, this
   2102          * is the process ID of the other process that is a client of this
   2103          * process.  This will be 0 if no other process is using this one.
   2104          */
   2105         public int importanceReasonPid;
   2106 
   2107         /**
   2108          * For the specified values of {@link #importanceReasonCode}, this
   2109          * is the name of the component that is being used in this process.
   2110          */
   2111         public ComponentName importanceReasonComponent;
   2112 
   2113         /**
   2114          * When {@link #importanceReasonPid} is non-0, this is the importance
   2115          * of the other pid. @hide
   2116          */
   2117         public int importanceReasonImportance;
   2118 
   2119         /**
   2120          * Current process state, as per PROCESS_STATE_* constants.
   2121          * @hide
   2122          */
   2123         public int processState;
   2124 
   2125         public RunningAppProcessInfo() {
   2126             importance = IMPORTANCE_FOREGROUND;
   2127             importanceReasonCode = REASON_UNKNOWN;
   2128             processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
   2129         }
   2130 
   2131         public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
   2132             processName = pProcessName;
   2133             pid = pPid;
   2134             pkgList = pArr;
   2135         }
   2136 
   2137         public int describeContents() {
   2138             return 0;
   2139         }
   2140 
   2141         public void writeToParcel(Parcel dest, int flags) {
   2142             dest.writeString(processName);
   2143             dest.writeInt(pid);
   2144             dest.writeInt(uid);
   2145             dest.writeStringArray(pkgList);
   2146             dest.writeInt(this.flags);
   2147             dest.writeInt(lastTrimLevel);
   2148             dest.writeInt(importance);
   2149             dest.writeInt(lru);
   2150             dest.writeInt(importanceReasonCode);
   2151             dest.writeInt(importanceReasonPid);
   2152             ComponentName.writeToParcel(importanceReasonComponent, dest);
   2153             dest.writeInt(importanceReasonImportance);
   2154             dest.writeInt(processState);
   2155         }
   2156 
   2157         public void readFromParcel(Parcel source) {
   2158             processName = source.readString();
   2159             pid = source.readInt();
   2160             uid = source.readInt();
   2161             pkgList = source.readStringArray();
   2162             flags = source.readInt();
   2163             lastTrimLevel = source.readInt();
   2164             importance = source.readInt();
   2165             lru = source.readInt();
   2166             importanceReasonCode = source.readInt();
   2167             importanceReasonPid = source.readInt();
   2168             importanceReasonComponent = ComponentName.readFromParcel(source);
   2169             importanceReasonImportance = source.readInt();
   2170             processState = source.readInt();
   2171         }
   2172 
   2173         public static final Creator<RunningAppProcessInfo> CREATOR =
   2174             new Creator<RunningAppProcessInfo>() {
   2175             public RunningAppProcessInfo createFromParcel(Parcel source) {
   2176                 return new RunningAppProcessInfo(source);
   2177             }
   2178             public RunningAppProcessInfo[] newArray(int size) {
   2179                 return new RunningAppProcessInfo[size];
   2180             }
   2181         };
   2182 
   2183         private RunningAppProcessInfo(Parcel source) {
   2184             readFromParcel(source);
   2185         }
   2186     }
   2187 
   2188     /**
   2189      * Returns a list of application processes installed on external media
   2190      * that are running on the device.
   2191      *
   2192      * <p><b>Note: this method is only intended for debugging or building
   2193      * a user-facing process management UI.</b></p>
   2194      *
   2195      * @return Returns a list of ApplicationInfo records, or null if none
   2196      * This list ordering is not specified.
   2197      * @hide
   2198      */
   2199     public List<ApplicationInfo> getRunningExternalApplications() {
   2200         try {
   2201             return ActivityManagerNative.getDefault().getRunningExternalApplications();
   2202         } catch (RemoteException e) {
   2203             return null;
   2204         }
   2205     }
   2206 
   2207     /**
   2208      * Returns a list of application processes that are running on the device.
   2209      *
   2210      * <p><b>Note: this method is only intended for debugging or building
   2211      * a user-facing process management UI.</b></p>
   2212      *
   2213      * @return Returns a list of RunningAppProcessInfo records, or null if there are no
   2214      * running processes (it will not return an empty list).  This list ordering is not
   2215      * specified.
   2216      */
   2217     public List<RunningAppProcessInfo> getRunningAppProcesses() {
   2218         try {
   2219             return ActivityManagerNative.getDefault().getRunningAppProcesses();
   2220         } catch (RemoteException e) {
   2221             return null;
   2222         }
   2223     }
   2224 
   2225     /**
   2226      * Return global memory state information for the calling process.  This
   2227      * does not fill in all fields of the {@link RunningAppProcessInfo}.  The
   2228      * only fields that will be filled in are
   2229      * {@link RunningAppProcessInfo#pid},
   2230      * {@link RunningAppProcessInfo#uid},
   2231      * {@link RunningAppProcessInfo#lastTrimLevel},
   2232      * {@link RunningAppProcessInfo#importance},
   2233      * {@link RunningAppProcessInfo#lru}, and
   2234      * {@link RunningAppProcessInfo#importanceReasonCode}.
   2235      */
   2236     static public void getMyMemoryState(RunningAppProcessInfo outState) {
   2237         try {
   2238             ActivityManagerNative.getDefault().getMyMemoryState(outState);
   2239         } catch (RemoteException e) {
   2240         }
   2241     }
   2242 
   2243     /**
   2244      * Return information about the memory usage of one or more processes.
   2245      *
   2246      * <p><b>Note: this method is only intended for debugging or building
   2247      * a user-facing process management UI.</b></p>
   2248      *
   2249      * @param pids The pids of the processes whose memory usage is to be
   2250      * retrieved.
   2251      * @return Returns an array of memory information, one for each
   2252      * requested pid.
   2253      */
   2254     public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) {
   2255         try {
   2256             return ActivityManagerNative.getDefault().getProcessMemoryInfo(pids);
   2257         } catch (RemoteException e) {
   2258             return null;
   2259         }
   2260     }
   2261 
   2262     /**
   2263      * @deprecated This is now just a wrapper for
   2264      * {@link #killBackgroundProcesses(String)}; the previous behavior here
   2265      * is no longer available to applications because it allows them to
   2266      * break other applications by removing their alarms, stopping their
   2267      * services, etc.
   2268      */
   2269     @Deprecated
   2270     public void restartPackage(String packageName) {
   2271         killBackgroundProcesses(packageName);
   2272     }
   2273 
   2274     /**
   2275      * Have the system immediately kill all background processes associated
   2276      * with the given package.  This is the same as the kernel killing those
   2277      * processes to reclaim memory; the system will take care of restarting
   2278      * these processes in the future as needed.
   2279      *
   2280      * <p>You must hold the permission
   2281      * {@link android.Manifest.permission#KILL_BACKGROUND_PROCESSES} to be able to
   2282      * call this method.
   2283      *
   2284      * @param packageName The name of the package whose processes are to
   2285      * be killed.
   2286      */
   2287     public void killBackgroundProcesses(String packageName) {
   2288         try {
   2289             ActivityManagerNative.getDefault().killBackgroundProcesses(packageName,
   2290                     UserHandle.myUserId());
   2291         } catch (RemoteException e) {
   2292         }
   2293     }
   2294 
   2295     /**
   2296      * Have the system perform a force stop of everything associated with
   2297      * the given application package.  All processes that share its uid
   2298      * will be killed, all services it has running stopped, all activities
   2299      * removed, etc.  In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED}
   2300      * broadcast will be sent, so that any of its registered alarms can
   2301      * be stopped, notifications removed, etc.
   2302      *
   2303      * <p>You must hold the permission
   2304      * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to
   2305      * call this method.
   2306      *
   2307      * @param packageName The name of the package to be stopped.
   2308      * @param userId The user for which the running package is to be stopped.
   2309      *
   2310      * @hide This is not available to third party applications due to
   2311      * it allowing them to break other applications by stopping their
   2312      * services, removing their alarms, etc.
   2313      */
   2314     public void forceStopPackageAsUser(String packageName, int userId) {
   2315         try {
   2316             ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);
   2317         } catch (RemoteException e) {
   2318         }
   2319     }
   2320 
   2321     /**
   2322      * @see #forceStopPackageAsUser(String, int)
   2323      * @hide
   2324      */
   2325     public void forceStopPackage(String packageName) {
   2326         forceStopPackageAsUser(packageName, UserHandle.myUserId());
   2327     }
   2328 
   2329     /**
   2330      * Get the device configuration attributes.
   2331      */
   2332     public ConfigurationInfo getDeviceConfigurationInfo() {
   2333         try {
   2334             return ActivityManagerNative.getDefault().getDeviceConfigurationInfo();
   2335         } catch (RemoteException e) {
   2336         }
   2337         return null;
   2338     }
   2339 
   2340     /**
   2341      * Get the preferred density of icons for the launcher. This is used when
   2342      * custom drawables are created (e.g., for shortcuts).
   2343      *
   2344      * @return density in terms of DPI
   2345      */
   2346     public int getLauncherLargeIconDensity() {
   2347         final Resources res = mContext.getResources();
   2348         final int density = res.getDisplayMetrics().densityDpi;
   2349         final int sw = res.getConfiguration().smallestScreenWidthDp;
   2350 
   2351         if (sw < 600) {
   2352             // Smaller than approx 7" tablets, use the regular icon size.
   2353             return density;
   2354         }
   2355 
   2356         switch (density) {
   2357             case DisplayMetrics.DENSITY_LOW:
   2358                 return DisplayMetrics.DENSITY_MEDIUM;
   2359             case DisplayMetrics.DENSITY_MEDIUM:
   2360                 return DisplayMetrics.DENSITY_HIGH;
   2361             case DisplayMetrics.DENSITY_TV:
   2362                 return DisplayMetrics.DENSITY_XHIGH;
   2363             case DisplayMetrics.DENSITY_HIGH:
   2364                 return DisplayMetrics.DENSITY_XHIGH;
   2365             case DisplayMetrics.DENSITY_XHIGH:
   2366                 return DisplayMetrics.DENSITY_XXHIGH;
   2367             case DisplayMetrics.DENSITY_XXHIGH:
   2368                 return DisplayMetrics.DENSITY_XHIGH * 2;
   2369             default:
   2370                 // The density is some abnormal value.  Return some other
   2371                 // abnormal value that is a reasonable scaling of it.
   2372                 return (int)((density*1.5f)+.5f);
   2373         }
   2374     }
   2375 
   2376     /**
   2377      * Get the preferred launcher icon size. This is used when custom drawables
   2378      * are created (e.g., for shortcuts).
   2379      *
   2380      * @return dimensions of square icons in terms of pixels
   2381      */
   2382     public int getLauncherLargeIconSize() {
   2383         return getLauncherLargeIconSizeInner(mContext);
   2384     }
   2385 
   2386     static int getLauncherLargeIconSizeInner(Context context) {
   2387         final Resources res = context.getResources();
   2388         final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size);
   2389         final int sw = res.getConfiguration().smallestScreenWidthDp;
   2390 
   2391         if (sw < 600) {
   2392             // Smaller than approx 7" tablets, use the regular icon size.
   2393             return size;
   2394         }
   2395 
   2396         final int density = res.getDisplayMetrics().densityDpi;
   2397 
   2398         switch (density) {
   2399             case DisplayMetrics.DENSITY_LOW:
   2400                 return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW;
   2401             case DisplayMetrics.DENSITY_MEDIUM:
   2402                 return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM;
   2403             case DisplayMetrics.DENSITY_TV:
   2404                 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
   2405             case DisplayMetrics.DENSITY_HIGH:
   2406                 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
   2407             case DisplayMetrics.DENSITY_XHIGH:
   2408                 return (size * DisplayMetrics.DENSITY_XXHIGH) / DisplayMetrics.DENSITY_XHIGH;
   2409             case DisplayMetrics.DENSITY_XXHIGH:
   2410                 return (size * DisplayMetrics.DENSITY_XHIGH*2) / DisplayMetrics.DENSITY_XXHIGH;
   2411             default:
   2412                 // The density is some abnormal value.  Return some other
   2413                 // abnormal value that is a reasonable scaling of it.
   2414                 return (int)((size*1.5f) + .5f);
   2415         }
   2416     }
   2417 
   2418     /**
   2419      * Returns "true" if the user interface is currently being messed with
   2420      * by a monkey.
   2421      */
   2422     public static boolean isUserAMonkey() {
   2423         try {
   2424             return ActivityManagerNative.getDefault().isUserAMonkey();
   2425         } catch (RemoteException e) {
   2426         }
   2427         return false;
   2428     }
   2429 
   2430     /**
   2431      * Returns "true" if device is running in a test harness.
   2432      */
   2433     public static boolean isRunningInTestHarness() {
   2434         return SystemProperties.getBoolean("ro.test_harness", false);
   2435     }
   2436 
   2437     /**
   2438      * Returns the launch count of each installed package.
   2439      *
   2440      * @hide
   2441      */
   2442     /*public Map<String, Integer> getAllPackageLaunchCounts() {
   2443         try {
   2444             IUsageStats usageStatsService = IUsageStats.Stub.asInterface(
   2445                     ServiceManager.getService("usagestats"));
   2446             if (usageStatsService == null) {
   2447                 return new HashMap<String, Integer>();
   2448             }
   2449 
   2450             UsageStats.PackageStats[] allPkgUsageStats = usageStatsService.getAllPkgUsageStats(
   2451                     ActivityThread.currentPackageName());
   2452             if (allPkgUsageStats == null) {
   2453                 return new HashMap<String, Integer>();
   2454             }
   2455 
   2456             Map<String, Integer> launchCounts = new HashMap<String, Integer>();
   2457             for (UsageStats.PackageStats pkgUsageStats : allPkgUsageStats) {
   2458                 launchCounts.put(pkgUsageStats.getPackageName(), pkgUsageStats.getLaunchCount());
   2459             }
   2460 
   2461             return launchCounts;
   2462         } catch (RemoteException e) {
   2463             Log.w(TAG, "Could not query launch counts", e);
   2464             return new HashMap<String, Integer>();
   2465         }
   2466     }*/
   2467 
   2468     /** @hide */
   2469     public static int checkComponentPermission(String permission, int uid,
   2470             int owningUid, boolean exported) {
   2471         // Root, system server get to do everything.
   2472         if (uid == 0 || uid == Process.SYSTEM_UID) {
   2473             return PackageManager.PERMISSION_GRANTED;
   2474         }
   2475         // Isolated processes don't get any permissions.
   2476         if (UserHandle.isIsolated(uid)) {
   2477             return PackageManager.PERMISSION_DENIED;
   2478         }
   2479         // If there is a uid that owns whatever is being accessed, it has
   2480         // blanket access to it regardless of the permissions it requires.
   2481         if (owningUid >= 0 && UserHandle.isSameApp(uid, owningUid)) {
   2482             return PackageManager.PERMISSION_GRANTED;
   2483         }
   2484         // If the target is not exported, then nobody else can get to it.
   2485         if (!exported) {
   2486             /*
   2487             RuntimeException here = new RuntimeException("here");
   2488             here.fillInStackTrace();
   2489             Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid,
   2490                     here);
   2491             */
   2492             return PackageManager.PERMISSION_DENIED;
   2493         }
   2494         if (permission == null) {
   2495             return PackageManager.PERMISSION_GRANTED;
   2496         }
   2497         try {
   2498             return AppGlobals.getPackageManager()
   2499                     .checkUidPermission(permission, uid);
   2500         } catch (RemoteException e) {
   2501             // Should never happen, but if it does... deny!
   2502             Slog.e(TAG, "PackageManager is dead?!?", e);
   2503         }
   2504         return PackageManager.PERMISSION_DENIED;
   2505     }
   2506 
   2507     /** @hide */
   2508     public static int checkUidPermission(String permission, int uid) {
   2509         try {
   2510             return AppGlobals.getPackageManager()
   2511                     .checkUidPermission(permission, uid);
   2512         } catch (RemoteException e) {
   2513             // Should never happen, but if it does... deny!
   2514             Slog.e(TAG, "PackageManager is dead?!?", e);
   2515         }
   2516         return PackageManager.PERMISSION_DENIED;
   2517     }
   2518 
   2519     /**
   2520      * @hide
   2521      * Helper for dealing with incoming user arguments to system service calls.
   2522      * Takes care of checking permissions and converting USER_CURRENT to the
   2523      * actual current user.
   2524      *
   2525      * @param callingPid The pid of the incoming call, as per Binder.getCallingPid().
   2526      * @param callingUid The uid of the incoming call, as per Binder.getCallingUid().
   2527      * @param userId The user id argument supplied by the caller -- this is the user
   2528      * they want to run as.
   2529      * @param allowAll If true, we will allow USER_ALL.  This means you must be prepared
   2530      * to get a USER_ALL returned and deal with it correctly.  If false,
   2531      * an exception will be thrown if USER_ALL is supplied.
   2532      * @param requireFull If true, the caller must hold
   2533      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} to be able to run as a
   2534      * different user than their current process; otherwise they must hold
   2535      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
   2536      * @param name Optional textual name of the incoming call; only for generating error messages.
   2537      * @param callerPackage Optional package name of caller; only for error messages.
   2538      *
   2539      * @return Returns the user ID that the call should run as.  Will always be a concrete
   2540      * user number, unless <var>allowAll</var> is true in which case it could also be
   2541      * USER_ALL.
   2542      */
   2543     public static int handleIncomingUser(int callingPid, int callingUid, int userId,
   2544             boolean allowAll, boolean requireFull, String name, String callerPackage) {
   2545         if (UserHandle.getUserId(callingUid) == userId) {
   2546             return userId;
   2547         }
   2548         try {
   2549             return ActivityManagerNative.getDefault().handleIncomingUser(callingPid,
   2550                     callingUid, userId, allowAll, requireFull, name, callerPackage);
   2551         } catch (RemoteException e) {
   2552             throw new SecurityException("Failed calling activity manager", e);
   2553         }
   2554     }
   2555 
   2556     /**
   2557      * Gets the userId of the current foreground user. Requires system permissions.
   2558      * @hide
   2559      */
   2560     @SystemApi
   2561     public static int getCurrentUser() {
   2562         UserInfo ui;
   2563         try {
   2564             ui = ActivityManagerNative.getDefault().getCurrentUser();
   2565             return ui != null ? ui.id : 0;
   2566         } catch (RemoteException e) {
   2567             return 0;
   2568         }
   2569     }
   2570 
   2571     /**
   2572      * @param userid the user's id. Zero indicates the default user
   2573      * @hide
   2574      */
   2575     public boolean switchUser(int userid) {
   2576         try {
   2577             return ActivityManagerNative.getDefault().switchUser(userid);
   2578         } catch (RemoteException e) {
   2579             return false;
   2580         }
   2581     }
   2582 
   2583     /**
   2584      * Return whether the given user is actively running.  This means that
   2585      * the user is in the "started" state, not "stopped" -- it is currently
   2586      * allowed to run code through scheduled alarms, receiving broadcasts,
   2587      * etc.  A started user may be either the current foreground user or a
   2588      * background user; the result here does not distinguish between the two.
   2589      * @param userid the user's id. Zero indicates the default user.
   2590      * @hide
   2591      */
   2592     public boolean isUserRunning(int userid) {
   2593         try {
   2594             return ActivityManagerNative.getDefault().isUserRunning(userid, false);
   2595         } catch (RemoteException e) {
   2596             return false;
   2597         }
   2598     }
   2599 
   2600     /**
   2601      * Perform a system dump of various state associated with the given application
   2602      * package name.  This call blocks while the dump is being performed, so should
   2603      * not be done on a UI thread.  The data will be written to the given file
   2604      * descriptor as text.  An application must hold the
   2605      * {@link android.Manifest.permission#DUMP} permission to make this call.
   2606      * @param fd The file descriptor that the dump should be written to.  The file
   2607      * descriptor is <em>not</em> closed by this function; the caller continues to
   2608      * own it.
   2609      * @param packageName The name of the package that is to be dumped.
   2610      */
   2611     public void dumpPackageState(FileDescriptor fd, String packageName) {
   2612         dumpPackageStateStatic(fd, packageName);
   2613     }
   2614 
   2615     /**
   2616      * @hide
   2617      */
   2618     public static void dumpPackageStateStatic(FileDescriptor fd, String packageName) {
   2619         FileOutputStream fout = new FileOutputStream(fd);
   2620         PrintWriter pw = new FastPrintWriter(fout);
   2621         dumpService(pw, fd, "package", new String[] { packageName });
   2622         pw.println();
   2623         dumpService(pw, fd, Context.ACTIVITY_SERVICE, new String[] {
   2624                 "-a", "package", packageName });
   2625         pw.println();
   2626         dumpService(pw, fd, "meminfo", new String[] { "--local", "--package", packageName });
   2627         pw.println();
   2628         dumpService(pw, fd, ProcessStats.SERVICE_NAME, new String[] { packageName });
   2629         pw.println();
   2630         dumpService(pw, fd, "usagestats", new String[] { "--packages", packageName });
   2631         pw.println();
   2632         dumpService(pw, fd, BatteryStats.SERVICE_NAME, new String[] { packageName });
   2633         pw.flush();
   2634     }
   2635 
   2636     private static void dumpService(PrintWriter pw, FileDescriptor fd, String name, String[] args) {
   2637         pw.print("DUMP OF SERVICE "); pw.print(name); pw.println(":");
   2638         IBinder service = ServiceManager.checkService(name);
   2639         if (service == null) {
   2640             pw.println("  (Service not found)");
   2641             return;
   2642         }
   2643         TransferPipe tp = null;
   2644         try {
   2645             pw.flush();
   2646             tp = new TransferPipe();
   2647             tp.setBufferPrefix("  ");
   2648             service.dumpAsync(tp.getWriteFd().getFileDescriptor(), args);
   2649             tp.go(fd, 10000);
   2650         } catch (Throwable e) {
   2651             if (tp != null) {
   2652                 tp.kill();
   2653             }
   2654             pw.println("Failure dumping service:");
   2655             e.printStackTrace(pw);
   2656         }
   2657     }
   2658 
   2659     /**
   2660      * @hide
   2661      */
   2662     public void startLockTaskMode(int taskId) {
   2663         try {
   2664             ActivityManagerNative.getDefault().startLockTaskMode(taskId);
   2665         } catch (RemoteException e) {
   2666         }
   2667     }
   2668 
   2669     /**
   2670      * @hide
   2671      */
   2672     public void stopLockTaskMode() {
   2673         try {
   2674             ActivityManagerNative.getDefault().stopLockTaskMode();
   2675         } catch (RemoteException e) {
   2676         }
   2677     }
   2678 
   2679     /**
   2680      * Return whether currently in lock task mode.  When in this mode
   2681      * no new tasks can be created or switched to.
   2682      *
   2683      * @see Activity#startLockTask()
   2684      */
   2685     public boolean isInLockTaskMode() {
   2686         try {
   2687             return ActivityManagerNative.getDefault().isInLockTaskMode();
   2688         } catch (RemoteException e) {
   2689             return false;
   2690         }
   2691     }
   2692 
   2693     /**
   2694      * The AppTask allows you to manage your own application's tasks.
   2695      * See {@link android.app.ActivityManager#getAppTasks()}
   2696      */
   2697     public static class AppTask {
   2698         private IAppTask mAppTaskImpl;
   2699 
   2700         /** @hide */
   2701         public AppTask(IAppTask task) {
   2702             mAppTaskImpl = task;
   2703         }
   2704 
   2705         /**
   2706          * Finishes all activities in this task and removes it from the recent tasks list.
   2707          */
   2708         public void finishAndRemoveTask() {
   2709             try {
   2710                 mAppTaskImpl.finishAndRemoveTask();
   2711             } catch (RemoteException e) {
   2712                 Slog.e(TAG, "Invalid AppTask", e);
   2713             }
   2714         }
   2715 
   2716         /**
   2717          * Get the RecentTaskInfo associated with this task.
   2718          *
   2719          * @return The RecentTaskInfo for this task, or null if the task no longer exists.
   2720          */
   2721         public RecentTaskInfo getTaskInfo() {
   2722             try {
   2723                 return mAppTaskImpl.getTaskInfo();
   2724             } catch (RemoteException e) {
   2725                 Slog.e(TAG, "Invalid AppTask", e);
   2726                 return null;
   2727             }
   2728         }
   2729 
   2730         /**
   2731          * Bring this task to the foreground.  If it contains activities, they will be
   2732          * brought to the foreground with it and their instances re-created if needed.
   2733          * If it doesn't contain activities, the root activity of the task will be
   2734          * re-launched.
   2735          */
   2736         public void moveToFront() {
   2737             try {
   2738                 mAppTaskImpl.moveToFront();
   2739             } catch (RemoteException e) {
   2740                 Slog.e(TAG, "Invalid AppTask", e);
   2741             }
   2742         }
   2743 
   2744         /**
   2745          * Start an activity in this task.  Brings the task to the foreground.  If this task
   2746          * is not currently active (that is, its id < 0), then a new activity for the given
   2747          * Intent will be launched as the root of the task and the task brought to the
   2748          * foreground.  Otherwise, if this task is currently active and the Intent does not specify
   2749          * an activity to launch in a new task, then a new activity for the given Intent will
   2750          * be launched on top of the task and the task brought to the foreground.  If this
   2751          * task is currently active and the Intent specifies {@link Intent#FLAG_ACTIVITY_NEW_TASK}
   2752          * or would otherwise be launched in to a new task, then the activity not launched but
   2753          * this task be brought to the foreground and a new intent delivered to the top
   2754          * activity if appropriate.
   2755          *
   2756          * <p>In other words, you generally want to use an Intent here that does not specify
   2757          * {@link Intent#FLAG_ACTIVITY_NEW_TASK} or {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT},
   2758          * and let the system do the right thing.</p>
   2759          *
   2760          * @param intent The Intent describing the new activity to be launched on the task.
   2761          * @param options Optional launch options.
   2762          *
   2763          * @see Activity#startActivity(android.content.Intent, android.os.Bundle)
   2764          */
   2765         public void startActivity(Context context, Intent intent, Bundle options) {
   2766             ActivityThread thread = ActivityThread.currentActivityThread();
   2767             thread.getInstrumentation().execStartActivityFromAppTask(context,
   2768                     thread.getApplicationThread(), mAppTaskImpl, intent, options);
   2769         }
   2770 
   2771         /**
   2772          * Modify the {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag in the root
   2773          * Intent of this AppTask.
   2774          *
   2775          * @param exclude If true, {@link Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} will
   2776          * be set; otherwise, it will be cleared.
   2777          */
   2778         public void setExcludeFromRecents(boolean exclude) {
   2779             try {
   2780                 mAppTaskImpl.setExcludeFromRecents(exclude);
   2781             } catch (RemoteException e) {
   2782                 Slog.e(TAG, "Invalid AppTask", e);
   2783             }
   2784         }
   2785     }
   2786 }
   2787