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