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