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