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 com.android.internal.app.IUsageStats; 20 import com.android.internal.os.PkgUsageStats; 21 import com.android.internal.util.MemInfoReader; 22 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.content.pm.ApplicationInfo; 27 import android.content.pm.ConfigurationInfo; 28 import android.content.pm.IPackageDataObserver; 29 import android.content.pm.PackageManager; 30 import android.content.res.Resources; 31 import android.graphics.Bitmap; 32 import android.graphics.Point; 33 import android.os.Binder; 34 import android.os.Bundle; 35 import android.os.Debug; 36 import android.os.Handler; 37 import android.os.Parcel; 38 import android.os.Parcelable; 39 import android.os.Process; 40 import android.os.RemoteException; 41 import android.os.ServiceManager; 42 import android.os.SystemProperties; 43 import android.os.UserId; 44 import android.text.TextUtils; 45 import android.util.DisplayMetrics; 46 import android.util.Log; 47 import android.util.Slog; 48 import android.view.Display; 49 50 import java.util.HashMap; 51 import java.util.List; 52 import java.util.Map; 53 54 /** 55 * Interact with the overall activities running in the system. 56 */ 57 public class ActivityManager { 58 private static String TAG = "ActivityManager"; 59 private static boolean localLOGV = false; 60 61 private final Context mContext; 62 private final Handler mHandler; 63 64 /** 65 * Result for IActivityManager.startActivity: an error where the 66 * start had to be canceled. 67 * @hide 68 */ 69 public static final int START_CANCELED = -6; 70 71 /** 72 * Result for IActivityManager.startActivity: an error where the 73 * thing being started is not an activity. 74 * @hide 75 */ 76 public static final int START_NOT_ACTIVITY = -5; 77 78 /** 79 * Result for IActivityManager.startActivity: an error where the 80 * caller does not have permission to start the activity. 81 * @hide 82 */ 83 public static final int START_PERMISSION_DENIED = -4; 84 85 /** 86 * Result for IActivityManager.startActivity: an error where the 87 * caller has requested both to forward a result and to receive 88 * a result. 89 * @hide 90 */ 91 public static final int START_FORWARD_AND_REQUEST_CONFLICT = -3; 92 93 /** 94 * Result for IActivityManager.startActivity: an error where the 95 * requested class is not found. 96 * @hide 97 */ 98 public static final int START_CLASS_NOT_FOUND = -2; 99 100 /** 101 * Result for IActivityManager.startActivity: an error where the 102 * given Intent could not be resolved to an activity. 103 * @hide 104 */ 105 public static final int START_INTENT_NOT_RESOLVED = -1; 106 107 /** 108 * Result for IActivityManaqer.startActivity: the activity was started 109 * successfully as normal. 110 * @hide 111 */ 112 public static final int START_SUCCESS = 0; 113 114 /** 115 * Result for IActivityManaqer.startActivity: the caller asked that the Intent not 116 * be executed if it is the recipient, and that is indeed the case. 117 * @hide 118 */ 119 public static final int START_RETURN_INTENT_TO_CALLER = 1; 120 121 /** 122 * Result for IActivityManaqer.startActivity: activity wasn't really started, but 123 * a task was simply brought to the foreground. 124 * @hide 125 */ 126 public static final int START_TASK_TO_FRONT = 2; 127 128 /** 129 * Result for IActivityManaqer.startActivity: activity wasn't really started, but 130 * the given Intent was given to the existing top activity. 131 * @hide 132 */ 133 public static final int START_DELIVERED_TO_TOP = 3; 134 135 /** 136 * Result for IActivityManaqer.startActivity: request was canceled because 137 * app switches are temporarily canceled to ensure the user's last request 138 * (such as pressing home) is performed. 139 * @hide 140 */ 141 public static final int START_SWITCHES_CANCELED = 4; 142 143 /** 144 * Flag for IActivityManaqer.startActivity: do special start mode where 145 * a new activity is launched only if it is needed. 146 * @hide 147 */ 148 public static final int START_FLAG_ONLY_IF_NEEDED = 1<<0; 149 150 /** 151 * Flag for IActivityManaqer.startActivity: launch the app for 152 * debugging. 153 * @hide 154 */ 155 public static final int START_FLAG_DEBUG = 1<<1; 156 157 /** 158 * Flag for IActivityManaqer.startActivity: launch the app for 159 * OpenGL tracing. 160 * @hide 161 */ 162 public static final int START_FLAG_OPENGL_TRACES = 1<<2; 163 164 /** 165 * Flag for IActivityManaqer.startActivity: if the app is being 166 * launched for profiling, automatically stop the profiler once done. 167 * @hide 168 */ 169 public static final int START_FLAG_AUTO_STOP_PROFILER = 1<<3; 170 171 /** 172 * Result for IActivityManaqer.broadcastIntent: success! 173 * @hide 174 */ 175 public static final int BROADCAST_SUCCESS = 0; 176 177 /** 178 * Result for IActivityManaqer.broadcastIntent: attempt to broadcast 179 * a sticky intent without appropriate permission. 180 * @hide 181 */ 182 public static final int BROADCAST_STICKY_CANT_HAVE_PERMISSION = -1; 183 184 /** 185 * Type for IActivityManaqer.getIntentSender: this PendingIntent is 186 * for a sendBroadcast operation. 187 * @hide 188 */ 189 public static final int INTENT_SENDER_BROADCAST = 1; 190 191 /** 192 * Type for IActivityManaqer.getIntentSender: this PendingIntent is 193 * for a startActivity operation. 194 * @hide 195 */ 196 public static final int INTENT_SENDER_ACTIVITY = 2; 197 198 /** 199 * Type for IActivityManaqer.getIntentSender: this PendingIntent is 200 * for an activity result operation. 201 * @hide 202 */ 203 public static final int INTENT_SENDER_ACTIVITY_RESULT = 3; 204 205 /** 206 * Type for IActivityManaqer.getIntentSender: this PendingIntent is 207 * for a startService operation. 208 * @hide 209 */ 210 public static final int INTENT_SENDER_SERVICE = 4; 211 ActivityManager(Context context, Handler handler)212 /*package*/ ActivityManager(Context context, Handler handler) { 213 mContext = context; 214 mHandler = handler; 215 } 216 217 /** 218 * Screen compatibility mode: the application most always run in 219 * compatibility mode. 220 * @hide 221 */ 222 public static final int COMPAT_MODE_ALWAYS = -1; 223 224 /** 225 * Screen compatibility mode: the application can never run in 226 * compatibility mode. 227 * @hide 228 */ 229 public static final int COMPAT_MODE_NEVER = -2; 230 231 /** 232 * Screen compatibility mode: unknown. 233 * @hide 234 */ 235 public static final int COMPAT_MODE_UNKNOWN = -3; 236 237 /** 238 * Screen compatibility mode: the application currently has compatibility 239 * mode disabled. 240 * @hide 241 */ 242 public static final int COMPAT_MODE_DISABLED = 0; 243 244 /** 245 * Screen compatibility mode: the application currently has compatibility 246 * mode enabled. 247 * @hide 248 */ 249 public static final int COMPAT_MODE_ENABLED = 1; 250 251 /** 252 * Screen compatibility mode: request to toggle the application's 253 * compatibility mode. 254 * @hide 255 */ 256 public static final int COMPAT_MODE_TOGGLE = 2; 257 258 /** @hide */ getFrontActivityScreenCompatMode()259 public int getFrontActivityScreenCompatMode() { 260 try { 261 return ActivityManagerNative.getDefault().getFrontActivityScreenCompatMode(); 262 } catch (RemoteException e) { 263 // System dead, we will be dead too soon! 264 return 0; 265 } 266 } 267 268 /** @hide */ setFrontActivityScreenCompatMode(int mode)269 public void setFrontActivityScreenCompatMode(int mode) { 270 try { 271 ActivityManagerNative.getDefault().setFrontActivityScreenCompatMode(mode); 272 } catch (RemoteException e) { 273 // System dead, we will be dead too soon! 274 } 275 } 276 277 /** @hide */ getPackageScreenCompatMode(String packageName)278 public int getPackageScreenCompatMode(String packageName) { 279 try { 280 return ActivityManagerNative.getDefault().getPackageScreenCompatMode(packageName); 281 } catch (RemoteException e) { 282 // System dead, we will be dead too soon! 283 return 0; 284 } 285 } 286 287 /** @hide */ setPackageScreenCompatMode(String packageName, int mode)288 public void setPackageScreenCompatMode(String packageName, int mode) { 289 try { 290 ActivityManagerNative.getDefault().setPackageScreenCompatMode(packageName, mode); 291 } catch (RemoteException e) { 292 // System dead, we will be dead too soon! 293 } 294 } 295 296 /** @hide */ getPackageAskScreenCompat(String packageName)297 public boolean getPackageAskScreenCompat(String packageName) { 298 try { 299 return ActivityManagerNative.getDefault().getPackageAskScreenCompat(packageName); 300 } catch (RemoteException e) { 301 // System dead, we will be dead too soon! 302 return false; 303 } 304 } 305 306 /** @hide */ setPackageAskScreenCompat(String packageName, boolean ask)307 public void setPackageAskScreenCompat(String packageName, boolean ask) { 308 try { 309 ActivityManagerNative.getDefault().setPackageAskScreenCompat(packageName, ask); 310 } catch (RemoteException e) { 311 // System dead, we will be dead too soon! 312 } 313 } 314 315 /** 316 * Return the approximate per-application memory class of the current 317 * device. This gives you an idea of how hard a memory limit you should 318 * impose on your application to let the overall system work best. The 319 * returned value is in megabytes; the baseline Android memory class is 320 * 16 (which happens to be the Java heap limit of those devices); some 321 * device with more memory may return 24 or even higher numbers. 322 */ getMemoryClass()323 public int getMemoryClass() { 324 return staticGetMemoryClass(); 325 } 326 327 /** @hide */ staticGetMemoryClass()328 static public int staticGetMemoryClass() { 329 // Really brain dead right now -- just take this from the configured 330 // vm heap size, and assume it is in megabytes and thus ends with "m". 331 String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", ""); 332 if (vmHeapSize != null && !"".equals(vmHeapSize)) { 333 return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); 334 } 335 return staticGetLargeMemoryClass(); 336 } 337 338 /** 339 * Return the approximate per-application memory class of the current 340 * device when an application is running with a large heap. This is the 341 * space available for memory-intensive applications; most applications 342 * should not need this amount of memory, and should instead stay with the 343 * {@link #getMemoryClass()} limit. The returned value is in megabytes. 344 * This may be the same size as {@link #getMemoryClass()} on memory 345 * constrained devices, or it may be significantly larger on devices with 346 * a large amount of available RAM. 347 * 348 * <p>The is the size of the application's Dalvik heap if it has 349 * specified <code>android:largeHeap="true"</code> in its manifest. 350 */ getLargeMemoryClass()351 public int getLargeMemoryClass() { 352 return staticGetLargeMemoryClass(); 353 } 354 355 /** @hide */ staticGetLargeMemoryClass()356 static public int staticGetLargeMemoryClass() { 357 // Really brain dead right now -- just take this from the configured 358 // vm heap size, and assume it is in megabytes and thus ends with "m". 359 String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m"); 360 return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1)); 361 } 362 363 /** 364 * Used by persistent processes to determine if they are running on a 365 * higher-end device so should be okay using hardware drawing acceleration 366 * (which tends to consume a lot more RAM). 367 * @hide 368 */ isHighEndGfx(Display display)369 static public boolean isHighEndGfx(Display display) { 370 MemInfoReader reader = new MemInfoReader(); 371 reader.readMemInfo(); 372 if (reader.getTotalSize() >= (512*1024*1024)) { 373 // If the device has at least 512MB RAM available to the kernel, 374 // we can afford the overhead of graphics acceleration. 375 return true; 376 } 377 Point p = new Point(); 378 display.getRealSize(p); 379 int pixels = p.x * p.y; 380 if (pixels >= (1024*600)) { 381 // If this is a sufficiently large screen, then there are enough 382 // pixels on it that we'd really like to use hw drawing. 383 return true; 384 } 385 return false; 386 } 387 388 /** 389 * Use to decide whether the running device can be considered a "large 390 * RAM" device. Exactly what memory limit large RAM is will vary, but 391 * it essentially means there is plenty of RAM to have lots of background 392 * processes running under decent loads. 393 * @hide 394 */ isLargeRAM()395 static public boolean isLargeRAM() { 396 MemInfoReader reader = new MemInfoReader(); 397 reader.readMemInfo(); 398 if (reader.getTotalSize() >= (640*1024*1024)) { 399 // Currently 640MB RAM available to the kernel is the point at 400 // which we have plenty of RAM to spare. 401 return true; 402 } 403 return false; 404 } 405 406 /** 407 * Information you can retrieve about tasks that the user has most recently 408 * started or visited. 409 */ 410 public static class RecentTaskInfo implements Parcelable { 411 /** 412 * If this task is currently running, this is the identifier for it. 413 * If it is not running, this will be -1. 414 */ 415 public int id; 416 417 /** 418 * The true identifier of this task, valid even if it is not running. 419 */ 420 public int persistentId; 421 422 /** 423 * The original Intent used to launch the task. You can use this 424 * Intent to re-launch the task (if it is no longer running) or bring 425 * the current task to the front. 426 */ 427 public Intent baseIntent; 428 429 /** 430 * If this task was started from an alias, this is the actual 431 * activity component that was initially started; the component of 432 * the baseIntent in this case is the name of the actual activity 433 * implementation that the alias referred to. Otherwise, this is null. 434 */ 435 public ComponentName origActivity; 436 437 /** 438 * Description of the task's last state. 439 */ 440 public CharSequence description; 441 RecentTaskInfo()442 public RecentTaskInfo() { 443 } 444 describeContents()445 public int describeContents() { 446 return 0; 447 } 448 writeToParcel(Parcel dest, int flags)449 public void writeToParcel(Parcel dest, int flags) { 450 dest.writeInt(id); 451 dest.writeInt(persistentId); 452 if (baseIntent != null) { 453 dest.writeInt(1); 454 baseIntent.writeToParcel(dest, 0); 455 } else { 456 dest.writeInt(0); 457 } 458 ComponentName.writeToParcel(origActivity, dest); 459 TextUtils.writeToParcel(description, dest, 460 Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 461 } 462 readFromParcel(Parcel source)463 public void readFromParcel(Parcel source) { 464 id = source.readInt(); 465 persistentId = source.readInt(); 466 if (source.readInt() != 0) { 467 baseIntent = Intent.CREATOR.createFromParcel(source); 468 } else { 469 baseIntent = null; 470 } 471 origActivity = ComponentName.readFromParcel(source); 472 description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 473 } 474 475 public static final Creator<RecentTaskInfo> CREATOR 476 = new Creator<RecentTaskInfo>() { 477 public RecentTaskInfo createFromParcel(Parcel source) { 478 return new RecentTaskInfo(source); 479 } 480 public RecentTaskInfo[] newArray(int size) { 481 return new RecentTaskInfo[size]; 482 } 483 }; 484 RecentTaskInfo(Parcel source)485 private RecentTaskInfo(Parcel source) { 486 readFromParcel(source); 487 } 488 } 489 490 /** 491 * Flag for use with {@link #getRecentTasks}: return all tasks, even those 492 * that have set their 493 * {@link android.content.Intent#FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS} flag. 494 */ 495 public static final int RECENT_WITH_EXCLUDED = 0x0001; 496 497 /** 498 * Provides a list that does not contain any 499 * recent tasks that currently are not available to the user. 500 */ 501 public static final int RECENT_IGNORE_UNAVAILABLE = 0x0002; 502 503 /** 504 * Return a list of the tasks that the user has recently launched, with 505 * the most recent being first and older ones after in order. 506 * 507 * <p><b>Note: this method is only intended for debugging and presenting 508 * task management user interfaces</b>. This should never be used for 509 * core logic in an application, such as deciding between different 510 * behaviors based on the information found here. Such uses are 511 * <em>not</em> supported, and will likely break in the future. For 512 * example, if multiple applications can be actively running at the 513 * same time, assumptions made about the meaning of the data here for 514 * purposes of control flow will be incorrect.</p> 515 * 516 * @param maxNum The maximum number of entries to return in the list. The 517 * actual number returned may be smaller, depending on how many tasks the 518 * user has started and the maximum number the system can remember. 519 * @param flags Information about what to return. May be any combination 520 * of {@link #RECENT_WITH_EXCLUDED} and {@link #RECENT_IGNORE_UNAVAILABLE}. 521 * 522 * @return Returns a list of RecentTaskInfo records describing each of 523 * the recent tasks. 524 * 525 * @throws SecurityException Throws SecurityException if the caller does 526 * not hold the {@link android.Manifest.permission#GET_TASKS} permission. 527 */ getRecentTasks(int maxNum, int flags)528 public List<RecentTaskInfo> getRecentTasks(int maxNum, int flags) 529 throws SecurityException { 530 try { 531 return ActivityManagerNative.getDefault().getRecentTasks(maxNum, 532 flags); 533 } catch (RemoteException e) { 534 // System dead, we will be dead too soon! 535 return null; 536 } 537 } 538 539 /** 540 * Information you can retrieve about a particular task that is currently 541 * "running" in the system. Note that a running task does not mean the 542 * given task actually has a process it is actively running in; it simply 543 * means that the user has gone to it and never closed it, but currently 544 * the system may have killed its process and is only holding on to its 545 * last state in order to restart it when the user returns. 546 */ 547 public static class RunningTaskInfo implements Parcelable { 548 /** 549 * A unique identifier for this task. 550 */ 551 public int id; 552 553 /** 554 * The component launched as the first activity in the task. This can 555 * be considered the "application" of this task. 556 */ 557 public ComponentName baseActivity; 558 559 /** 560 * The activity component at the top of the history stack of the task. 561 * This is what the user is currently doing. 562 */ 563 public ComponentName topActivity; 564 565 /** 566 * Thumbnail representation of the task's current state. Currently 567 * always null. 568 */ 569 public Bitmap thumbnail; 570 571 /** 572 * Description of the task's current state. 573 */ 574 public CharSequence description; 575 576 /** 577 * Number of activities in this task. 578 */ 579 public int numActivities; 580 581 /** 582 * Number of activities that are currently running (not stopped 583 * and persisted) in this task. 584 */ 585 public int numRunning; 586 RunningTaskInfo()587 public RunningTaskInfo() { 588 } 589 describeContents()590 public int describeContents() { 591 return 0; 592 } 593 writeToParcel(Parcel dest, int flags)594 public void writeToParcel(Parcel dest, int flags) { 595 dest.writeInt(id); 596 ComponentName.writeToParcel(baseActivity, dest); 597 ComponentName.writeToParcel(topActivity, dest); 598 if (thumbnail != null) { 599 dest.writeInt(1); 600 thumbnail.writeToParcel(dest, 0); 601 } else { 602 dest.writeInt(0); 603 } 604 TextUtils.writeToParcel(description, dest, 605 Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 606 dest.writeInt(numActivities); 607 dest.writeInt(numRunning); 608 } 609 readFromParcel(Parcel source)610 public void readFromParcel(Parcel source) { 611 id = source.readInt(); 612 baseActivity = ComponentName.readFromParcel(source); 613 topActivity = ComponentName.readFromParcel(source); 614 if (source.readInt() != 0) { 615 thumbnail = Bitmap.CREATOR.createFromParcel(source); 616 } else { 617 thumbnail = null; 618 } 619 description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 620 numActivities = source.readInt(); 621 numRunning = source.readInt(); 622 } 623 624 public static final Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() { 625 public RunningTaskInfo createFromParcel(Parcel source) { 626 return new RunningTaskInfo(source); 627 } 628 public RunningTaskInfo[] newArray(int size) { 629 return new RunningTaskInfo[size]; 630 } 631 }; 632 RunningTaskInfo(Parcel source)633 private RunningTaskInfo(Parcel source) { 634 readFromParcel(source); 635 } 636 } 637 638 /** 639 * Return a list of the tasks that are currently running, with 640 * the most recent being first and older ones after in order. Note that 641 * "running" does not mean any of the task's code is currently loaded or 642 * activity -- the task may have been frozen by the system, so that it 643 * can be restarted in its previous state when next brought to the 644 * foreground. 645 * 646 * @param maxNum The maximum number of entries to return in the list. The 647 * actual number returned may be smaller, depending on how many tasks the 648 * user has started. 649 * 650 * @param flags Optional flags 651 * @param receiver Optional receiver for delayed thumbnails 652 * 653 * @return Returns a list of RunningTaskInfo records describing each of 654 * the running tasks. 655 * 656 * Some thumbnails may not be available at the time of this call. The optional 657 * receiver may be used to receive those thumbnails. 658 * 659 * @throws SecurityException Throws SecurityException if the caller does 660 * not hold the {@link android.Manifest.permission#GET_TASKS} permission. 661 * 662 * @hide 663 */ getRunningTasks(int maxNum, int flags, IThumbnailReceiver receiver)664 public List<RunningTaskInfo> getRunningTasks(int maxNum, int flags, IThumbnailReceiver receiver) 665 throws SecurityException { 666 try { 667 return ActivityManagerNative.getDefault().getTasks(maxNum, flags, receiver); 668 } catch (RemoteException e) { 669 // System dead, we will be dead too soon! 670 return null; 671 } 672 } 673 674 /** 675 * Return a list of the tasks that are currently running, with 676 * the most recent being first and older ones after in order. Note that 677 * "running" does not mean any of the task's code is currently loaded or 678 * activity -- the task may have been frozen by the system, so that it 679 * can be restarted in its previous state when next brought to the 680 * foreground. 681 * 682 * <p><b>Note: this method is only intended for debugging and presenting 683 * task management user interfaces</b>. This should never be used for 684 * core logic in an application, such as deciding between different 685 * behaviors based on the information found here. Such uses are 686 * <em>not</em> supported, and will likely break in the future. For 687 * example, if multiple applications can be actively running at the 688 * same time, assumptions made about the meaning of the data here for 689 * purposes of control flow will be incorrect.</p> 690 * 691 * @param maxNum The maximum number of entries to return in the list. The 692 * actual number returned may be smaller, depending on how many tasks the 693 * user has started. 694 * 695 * @return Returns a list of RunningTaskInfo records describing each of 696 * the running tasks. 697 * 698 * @throws SecurityException Throws SecurityException if the caller does 699 * not hold the {@link android.Manifest.permission#GET_TASKS} permission. 700 */ getRunningTasks(int maxNum)701 public List<RunningTaskInfo> getRunningTasks(int maxNum) 702 throws SecurityException { 703 return getRunningTasks(maxNum, 0, null); 704 } 705 706 /** 707 * Remove some end of a task's activity stack that is not part of 708 * the main application. The selected activities will be finished, so 709 * they are no longer part of the main task. 710 * 711 * @param taskId The identifier of the task. 712 * @param subTaskIndex The number of the sub-task; this corresponds 713 * to the index of the thumbnail returned by {@link #getTaskThumbnails(int)}. 714 * @return Returns true if the sub-task was found and was removed. 715 * 716 * @hide 717 */ removeSubTask(int taskId, int subTaskIndex)718 public boolean removeSubTask(int taskId, int subTaskIndex) 719 throws SecurityException { 720 try { 721 return ActivityManagerNative.getDefault().removeSubTask(taskId, subTaskIndex); 722 } catch (RemoteException e) { 723 // System dead, we will be dead too soon! 724 return false; 725 } 726 } 727 728 /** 729 * If set, the process of the root activity of the task will be killed 730 * as part of removing the task. 731 * @hide 732 */ 733 public static final int REMOVE_TASK_KILL_PROCESS = 0x0001; 734 735 /** 736 * Completely remove the given task. 737 * 738 * @param taskId Identifier of the task to be removed. 739 * @param flags Additional operational flags. May be 0 or 740 * {@link #REMOVE_TASK_KILL_PROCESS}. 741 * @return Returns true if the given task was found and removed. 742 * 743 * @hide 744 */ removeTask(int taskId, int flags)745 public boolean removeTask(int taskId, int flags) 746 throws SecurityException { 747 try { 748 return ActivityManagerNative.getDefault().removeTask(taskId, flags); 749 } catch (RemoteException e) { 750 // System dead, we will be dead too soon! 751 return false; 752 } 753 } 754 755 /** @hide */ 756 public static class TaskThumbnails implements Parcelable { 757 public Bitmap mainThumbnail; 758 759 public int numSubThumbbails; 760 761 /** @hide */ 762 public IThumbnailRetriever retriever; 763 TaskThumbnails()764 public TaskThumbnails() { 765 } 766 getSubThumbnail(int index)767 public Bitmap getSubThumbnail(int index) { 768 try { 769 return retriever.getThumbnail(index); 770 } catch (RemoteException e) { 771 return null; 772 } 773 } 774 describeContents()775 public int describeContents() { 776 return 0; 777 } 778 writeToParcel(Parcel dest, int flags)779 public void writeToParcel(Parcel dest, int flags) { 780 if (mainThumbnail != null) { 781 dest.writeInt(1); 782 mainThumbnail.writeToParcel(dest, 0); 783 } else { 784 dest.writeInt(0); 785 } 786 dest.writeInt(numSubThumbbails); 787 dest.writeStrongInterface(retriever); 788 } 789 readFromParcel(Parcel source)790 public void readFromParcel(Parcel source) { 791 if (source.readInt() != 0) { 792 mainThumbnail = Bitmap.CREATOR.createFromParcel(source); 793 } else { 794 mainThumbnail = null; 795 } 796 numSubThumbbails = source.readInt(); 797 retriever = IThumbnailRetriever.Stub.asInterface(source.readStrongBinder()); 798 } 799 800 public static final Creator<TaskThumbnails> CREATOR = new Creator<TaskThumbnails>() { 801 public TaskThumbnails createFromParcel(Parcel source) { 802 return new TaskThumbnails(source); 803 } 804 public TaskThumbnails[] newArray(int size) { 805 return new TaskThumbnails[size]; 806 } 807 }; 808 TaskThumbnails(Parcel source)809 private TaskThumbnails(Parcel source) { 810 readFromParcel(source); 811 } 812 } 813 814 /** @hide */ getTaskThumbnails(int id)815 public TaskThumbnails getTaskThumbnails(int id) throws SecurityException { 816 try { 817 return ActivityManagerNative.getDefault().getTaskThumbnails(id); 818 } catch (RemoteException e) { 819 // System dead, we will be dead too soon! 820 return null; 821 } 822 } 823 824 /** 825 * Flag for {@link #moveTaskToFront(int, int)}: also move the "home" 826 * activity along with the task, so it is positioned immediately behind 827 * the task. 828 */ 829 public static final int MOVE_TASK_WITH_HOME = 0x00000001; 830 831 /** 832 * Flag for {@link #moveTaskToFront(int, int)}: don't count this as a 833 * user-instigated action, so the current activity will not receive a 834 * hint that the user is leaving. 835 */ 836 public static final int MOVE_TASK_NO_USER_ACTION = 0x00000002; 837 838 /** 839 * Equivalent to calling {@link #moveTaskToFront(int, int, Bundle)} 840 * with a null options argument. 841 * 842 * @param taskId The identifier of the task to be moved, as found in 843 * {@link RunningTaskInfo} or {@link RecentTaskInfo}. 844 * @param flags Additional operational flags, 0 or more of 845 * {@link #MOVE_TASK_WITH_HOME}. 846 */ moveTaskToFront(int taskId, int flags)847 public void moveTaskToFront(int taskId, int flags) { 848 moveTaskToFront(taskId, flags, null); 849 } 850 851 /** 852 * Ask that the task associated with a given task ID be moved to the 853 * front of the stack, so it is now visible to the user. Requires that 854 * the caller hold permission {@link android.Manifest.permission#REORDER_TASKS} 855 * or a SecurityException will be thrown. 856 * 857 * @param taskId The identifier of the task to be moved, as found in 858 * {@link RunningTaskInfo} or {@link RecentTaskInfo}. 859 * @param flags Additional operational flags, 0 or more of 860 * {@link #MOVE_TASK_WITH_HOME}. 861 * @param options Additional options for the operation, either null or 862 * as per {@link Context#startActivity(Intent, android.os.Bundle) 863 * Context.startActivity(Intent, Bundle)}. 864 */ moveTaskToFront(int taskId, int flags, Bundle options)865 public void moveTaskToFront(int taskId, int flags, Bundle options) { 866 try { 867 ActivityManagerNative.getDefault().moveTaskToFront(taskId, flags, options); 868 } catch (RemoteException e) { 869 // System dead, we will be dead too soon! 870 } 871 } 872 873 /** 874 * Information you can retrieve about a particular Service that is 875 * currently running in the system. 876 */ 877 public static class RunningServiceInfo implements Parcelable { 878 /** 879 * The service component. 880 */ 881 public ComponentName service; 882 883 /** 884 * If non-zero, this is the process the service is running in. 885 */ 886 public int pid; 887 888 /** 889 * The UID that owns this service. 890 */ 891 public int uid; 892 893 /** 894 * The name of the process this service runs in. 895 */ 896 public String process; 897 898 /** 899 * Set to true if the service has asked to run as a foreground process. 900 */ 901 public boolean foreground; 902 903 /** 904 * The time when the service was first made active, either by someone 905 * starting or binding to it. This 906 * is in units of {@link android.os.SystemClock#elapsedRealtime()}. 907 */ 908 public long activeSince; 909 910 /** 911 * Set to true if this service has been explicitly started. 912 */ 913 public boolean started; 914 915 /** 916 * Number of clients connected to the service. 917 */ 918 public int clientCount; 919 920 /** 921 * Number of times the service's process has crashed while the service 922 * is running. 923 */ 924 public int crashCount; 925 926 /** 927 * The time when there was last activity in the service (either 928 * explicit requests to start it or clients binding to it). This 929 * is in units of {@link android.os.SystemClock#uptimeMillis()}. 930 */ 931 public long lastActivityTime; 932 933 /** 934 * If non-zero, this service is not currently running, but scheduled to 935 * restart at the given time. 936 */ 937 public long restarting; 938 939 /** 940 * Bit for {@link #flags}: set if this service has been 941 * explicitly started. 942 */ 943 public static final int FLAG_STARTED = 1<<0; 944 945 /** 946 * Bit for {@link #flags}: set if the service has asked to 947 * run as a foreground process. 948 */ 949 public static final int FLAG_FOREGROUND = 1<<1; 950 951 /** 952 * Bit for {@link #flags): set if the service is running in a 953 * core system process. 954 */ 955 public static final int FLAG_SYSTEM_PROCESS = 1<<2; 956 957 /** 958 * Bit for {@link #flags): set if the service is running in a 959 * persistent process. 960 */ 961 public static final int FLAG_PERSISTENT_PROCESS = 1<<3; 962 963 /** 964 * Running flags. 965 */ 966 public int flags; 967 968 /** 969 * For special services that are bound to by system code, this is 970 * the package that holds the binding. 971 */ 972 public String clientPackage; 973 974 /** 975 * For special services that are bound to by system code, this is 976 * a string resource providing a user-visible label for who the 977 * client is. 978 */ 979 public int clientLabel; 980 RunningServiceInfo()981 public RunningServiceInfo() { 982 } 983 describeContents()984 public int describeContents() { 985 return 0; 986 } 987 writeToParcel(Parcel dest, int flags)988 public void writeToParcel(Parcel dest, int flags) { 989 ComponentName.writeToParcel(service, dest); 990 dest.writeInt(pid); 991 dest.writeInt(uid); 992 dest.writeString(process); 993 dest.writeInt(foreground ? 1 : 0); 994 dest.writeLong(activeSince); 995 dest.writeInt(started ? 1 : 0); 996 dest.writeInt(clientCount); 997 dest.writeInt(crashCount); 998 dest.writeLong(lastActivityTime); 999 dest.writeLong(restarting); 1000 dest.writeInt(this.flags); 1001 dest.writeString(clientPackage); 1002 dest.writeInt(clientLabel); 1003 } 1004 readFromParcel(Parcel source)1005 public void readFromParcel(Parcel source) { 1006 service = ComponentName.readFromParcel(source); 1007 pid = source.readInt(); 1008 uid = source.readInt(); 1009 process = source.readString(); 1010 foreground = source.readInt() != 0; 1011 activeSince = source.readLong(); 1012 started = source.readInt() != 0; 1013 clientCount = source.readInt(); 1014 crashCount = source.readInt(); 1015 lastActivityTime = source.readLong(); 1016 restarting = source.readLong(); 1017 flags = source.readInt(); 1018 clientPackage = source.readString(); 1019 clientLabel = source.readInt(); 1020 } 1021 1022 public static final Creator<RunningServiceInfo> CREATOR = new Creator<RunningServiceInfo>() { 1023 public RunningServiceInfo createFromParcel(Parcel source) { 1024 return new RunningServiceInfo(source); 1025 } 1026 public RunningServiceInfo[] newArray(int size) { 1027 return new RunningServiceInfo[size]; 1028 } 1029 }; 1030 RunningServiceInfo(Parcel source)1031 private RunningServiceInfo(Parcel source) { 1032 readFromParcel(source); 1033 } 1034 } 1035 1036 /** 1037 * Return a list of the services that are currently running. 1038 * 1039 * <p><b>Note: this method is only intended for debugging or implementing 1040 * service management type user interfaces.</b></p> 1041 * 1042 * @param maxNum The maximum number of entries to return in the list. The 1043 * actual number returned may be smaller, depending on how many services 1044 * are running. 1045 * 1046 * @return Returns a list of RunningServiceInfo records describing each of 1047 * the running tasks. 1048 */ getRunningServices(int maxNum)1049 public List<RunningServiceInfo> getRunningServices(int maxNum) 1050 throws SecurityException { 1051 try { 1052 return ActivityManagerNative.getDefault() 1053 .getServices(maxNum, 0); 1054 } catch (RemoteException e) { 1055 // System dead, we will be dead too soon! 1056 return null; 1057 } 1058 } 1059 1060 /** 1061 * Returns a PendingIntent you can start to show a control panel for the 1062 * given running service. If the service does not have a control panel, 1063 * null is returned. 1064 */ getRunningServiceControlPanel(ComponentName service)1065 public PendingIntent getRunningServiceControlPanel(ComponentName service) 1066 throws SecurityException { 1067 try { 1068 return ActivityManagerNative.getDefault() 1069 .getRunningServiceControlPanel(service); 1070 } catch (RemoteException e) { 1071 // System dead, we will be dead too soon! 1072 return null; 1073 } 1074 } 1075 1076 /** 1077 * Information you can retrieve about the available memory through 1078 * {@link ActivityManager#getMemoryInfo}. 1079 */ 1080 public static class MemoryInfo implements Parcelable { 1081 /** 1082 * The available memory on the system. This number should not 1083 * be considered absolute: due to the nature of the kernel, a significant 1084 * portion of this memory is actually in use and needed for the overall 1085 * system to run well. 1086 */ 1087 public long availMem; 1088 1089 /** 1090 * The total memory accessible by the kernel. This is basically the 1091 * RAM size of the device, not including below-kernel fixed allocations 1092 * like DMA buffers, RAM for the baseband CPU, etc. 1093 */ 1094 public long totalMem; 1095 1096 /** 1097 * The threshold of {@link #availMem} at which we consider memory to be 1098 * low and start killing background services and other non-extraneous 1099 * processes. 1100 */ 1101 public long threshold; 1102 1103 /** 1104 * Set to true if the system considers itself to currently be in a low 1105 * memory situation. 1106 */ 1107 public boolean lowMemory; 1108 1109 /** @hide */ 1110 public long hiddenAppThreshold; 1111 /** @hide */ 1112 public long secondaryServerThreshold; 1113 /** @hide */ 1114 public long visibleAppThreshold; 1115 /** @hide */ 1116 public long foregroundAppThreshold; 1117 MemoryInfo()1118 public MemoryInfo() { 1119 } 1120 describeContents()1121 public int describeContents() { 1122 return 0; 1123 } 1124 writeToParcel(Parcel dest, int flags)1125 public void writeToParcel(Parcel dest, int flags) { 1126 dest.writeLong(availMem); 1127 dest.writeLong(totalMem); 1128 dest.writeLong(threshold); 1129 dest.writeInt(lowMemory ? 1 : 0); 1130 dest.writeLong(hiddenAppThreshold); 1131 dest.writeLong(secondaryServerThreshold); 1132 dest.writeLong(visibleAppThreshold); 1133 dest.writeLong(foregroundAppThreshold); 1134 } 1135 readFromParcel(Parcel source)1136 public void readFromParcel(Parcel source) { 1137 availMem = source.readLong(); 1138 totalMem = source.readLong(); 1139 threshold = source.readLong(); 1140 lowMemory = source.readInt() != 0; 1141 hiddenAppThreshold = source.readLong(); 1142 secondaryServerThreshold = source.readLong(); 1143 visibleAppThreshold = source.readLong(); 1144 foregroundAppThreshold = source.readLong(); 1145 } 1146 1147 public static final Creator<MemoryInfo> CREATOR 1148 = new Creator<MemoryInfo>() { 1149 public MemoryInfo createFromParcel(Parcel source) { 1150 return new MemoryInfo(source); 1151 } 1152 public MemoryInfo[] newArray(int size) { 1153 return new MemoryInfo[size]; 1154 } 1155 }; 1156 MemoryInfo(Parcel source)1157 private MemoryInfo(Parcel source) { 1158 readFromParcel(source); 1159 } 1160 } 1161 1162 /** 1163 * Return general information about the memory state of the system. This 1164 * can be used to help decide how to manage your own memory, though note 1165 * that polling is not recommended and 1166 * {@link android.content.ComponentCallbacks2#onTrimMemory(int) 1167 * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this. 1168 * Also see {@link #getMyMemoryState} for how to retrieve the current trim 1169 * level of your process as needed, which gives a better hint for how to 1170 * manage its memory. 1171 */ getMemoryInfo(MemoryInfo outInfo)1172 public void getMemoryInfo(MemoryInfo outInfo) { 1173 try { 1174 ActivityManagerNative.getDefault().getMemoryInfo(outInfo); 1175 } catch (RemoteException e) { 1176 } 1177 } 1178 1179 /** 1180 * @hide 1181 */ clearApplicationUserData(String packageName, IPackageDataObserver observer)1182 public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) { 1183 try { 1184 return ActivityManagerNative.getDefault().clearApplicationUserData(packageName, 1185 observer, Binder.getOrigCallingUser()); 1186 } catch (RemoteException e) { 1187 return false; 1188 } 1189 } 1190 1191 /** 1192 * Information you can retrieve about any processes that are in an error condition. 1193 */ 1194 public static class ProcessErrorStateInfo implements Parcelable { 1195 /** 1196 * Condition codes 1197 */ 1198 public static final int NO_ERROR = 0; 1199 public static final int CRASHED = 1; 1200 public static final int NOT_RESPONDING = 2; 1201 1202 /** 1203 * The condition that the process is in. 1204 */ 1205 public int condition; 1206 1207 /** 1208 * The process name in which the crash or error occurred. 1209 */ 1210 public String processName; 1211 1212 /** 1213 * The pid of this process; 0 if none 1214 */ 1215 public int pid; 1216 1217 /** 1218 * The kernel user-ID that has been assigned to this process; 1219 * currently this is not a unique ID (multiple applications can have 1220 * the same uid). 1221 */ 1222 public int uid; 1223 1224 /** 1225 * The activity name associated with the error, if known. May be null. 1226 */ 1227 public String tag; 1228 1229 /** 1230 * A short message describing the error condition. 1231 */ 1232 public String shortMsg; 1233 1234 /** 1235 * A long message describing the error condition. 1236 */ 1237 public String longMsg; 1238 1239 /** 1240 * The stack trace where the error originated. May be null. 1241 */ 1242 public String stackTrace; 1243 1244 /** 1245 * to be deprecated: This value will always be null. 1246 */ 1247 public byte[] crashData = null; 1248 ProcessErrorStateInfo()1249 public ProcessErrorStateInfo() { 1250 } 1251 describeContents()1252 public int describeContents() { 1253 return 0; 1254 } 1255 writeToParcel(Parcel dest, int flags)1256 public void writeToParcel(Parcel dest, int flags) { 1257 dest.writeInt(condition); 1258 dest.writeString(processName); 1259 dest.writeInt(pid); 1260 dest.writeInt(uid); 1261 dest.writeString(tag); 1262 dest.writeString(shortMsg); 1263 dest.writeString(longMsg); 1264 dest.writeString(stackTrace); 1265 } 1266 readFromParcel(Parcel source)1267 public void readFromParcel(Parcel source) { 1268 condition = source.readInt(); 1269 processName = source.readString(); 1270 pid = source.readInt(); 1271 uid = source.readInt(); 1272 tag = source.readString(); 1273 shortMsg = source.readString(); 1274 longMsg = source.readString(); 1275 stackTrace = source.readString(); 1276 } 1277 1278 public static final Creator<ProcessErrorStateInfo> CREATOR = 1279 new Creator<ProcessErrorStateInfo>() { 1280 public ProcessErrorStateInfo createFromParcel(Parcel source) { 1281 return new ProcessErrorStateInfo(source); 1282 } 1283 public ProcessErrorStateInfo[] newArray(int size) { 1284 return new ProcessErrorStateInfo[size]; 1285 } 1286 }; 1287 ProcessErrorStateInfo(Parcel source)1288 private ProcessErrorStateInfo(Parcel source) { 1289 readFromParcel(source); 1290 } 1291 } 1292 1293 /** 1294 * Returns a list of any processes that are currently in an error condition. The result 1295 * will be null if all processes are running properly at this time. 1296 * 1297 * @return Returns a list of ProcessErrorStateInfo records, or null if there are no 1298 * current error conditions (it will not return an empty list). This list ordering is not 1299 * specified. 1300 */ getProcessesInErrorState()1301 public List<ProcessErrorStateInfo> getProcessesInErrorState() { 1302 try { 1303 return ActivityManagerNative.getDefault().getProcessesInErrorState(); 1304 } catch (RemoteException e) { 1305 return null; 1306 } 1307 } 1308 1309 /** 1310 * Information you can retrieve about a running process. 1311 */ 1312 public static class RunningAppProcessInfo implements Parcelable { 1313 /** 1314 * The name of the process that this object is associated with 1315 */ 1316 public String processName; 1317 1318 /** 1319 * The pid of this process; 0 if none 1320 */ 1321 public int pid; 1322 1323 /** 1324 * The user id of this process. 1325 */ 1326 public int uid; 1327 1328 /** 1329 * All packages that have been loaded into the process. 1330 */ 1331 public String pkgList[]; 1332 1333 /** 1334 * Constant for {@link #flags}: this is an app that is unable to 1335 * correctly save its state when going to the background, 1336 * so it can not be killed while in the background. 1337 * @hide 1338 */ 1339 public static final int FLAG_CANT_SAVE_STATE = 1<<0; 1340 1341 /** 1342 * Constant for {@link #flags}: this process is associated with a 1343 * persistent system app. 1344 * @hide 1345 */ 1346 public static final int FLAG_PERSISTENT = 1<<1; 1347 1348 /** 1349 * Flags of information. May be any of 1350 * {@link #FLAG_CANT_SAVE_STATE}. 1351 * @hide 1352 */ 1353 public int flags; 1354 1355 /** 1356 * Last memory trim level reported to the process: corresponds to 1357 * the values supplied to {@link android.content.ComponentCallbacks2#onTrimMemory(int) 1358 * ComponentCallbacks2.onTrimMemory(int)}. 1359 */ 1360 public int lastTrimLevel; 1361 1362 /** 1363 * Constant for {@link #importance}: this is a persistent process. 1364 * Only used when reporting to process observers. 1365 * @hide 1366 */ 1367 public static final int IMPORTANCE_PERSISTENT = 50; 1368 1369 /** 1370 * Constant for {@link #importance}: this process is running the 1371 * foreground UI. 1372 */ 1373 public static final int IMPORTANCE_FOREGROUND = 100; 1374 1375 /** 1376 * Constant for {@link #importance}: this process is running something 1377 * that is actively visible to the user, though not in the immediate 1378 * foreground. 1379 */ 1380 public static final int IMPORTANCE_VISIBLE = 200; 1381 1382 /** 1383 * Constant for {@link #importance}: this process is running something 1384 * that is considered to be actively perceptible to the user. An 1385 * example would be an application performing background music playback. 1386 */ 1387 public static final int IMPORTANCE_PERCEPTIBLE = 130; 1388 1389 /** 1390 * Constant for {@link #importance}: this process is running an 1391 * application that can not save its state, and thus can't be killed 1392 * while in the background. 1393 * @hide 1394 */ 1395 public static final int IMPORTANCE_CANT_SAVE_STATE = 170; 1396 1397 /** 1398 * Constant for {@link #importance}: this process is contains services 1399 * that should remain running. 1400 */ 1401 public static final int IMPORTANCE_SERVICE = 300; 1402 1403 /** 1404 * Constant for {@link #importance}: this process process contains 1405 * background code that is expendable. 1406 */ 1407 public static final int IMPORTANCE_BACKGROUND = 400; 1408 1409 /** 1410 * Constant for {@link #importance}: this process is empty of any 1411 * actively running code. 1412 */ 1413 public static final int IMPORTANCE_EMPTY = 500; 1414 1415 /** 1416 * The relative importance level that the system places on this 1417 * process. May be one of {@link #IMPORTANCE_FOREGROUND}, 1418 * {@link #IMPORTANCE_VISIBLE}, {@link #IMPORTANCE_SERVICE}, 1419 * {@link #IMPORTANCE_BACKGROUND}, or {@link #IMPORTANCE_EMPTY}. These 1420 * constants are numbered so that "more important" values are always 1421 * smaller than "less important" values. 1422 */ 1423 public int importance; 1424 1425 /** 1426 * An additional ordering within a particular {@link #importance} 1427 * category, providing finer-grained information about the relative 1428 * utility of processes within a category. This number means nothing 1429 * except that a smaller values are more recently used (and thus 1430 * more important). Currently an LRU value is only maintained for 1431 * the {@link #IMPORTANCE_BACKGROUND} category, though others may 1432 * be maintained in the future. 1433 */ 1434 public int lru; 1435 1436 /** 1437 * Constant for {@link #importanceReasonCode}: nothing special has 1438 * been specified for the reason for this level. 1439 */ 1440 public static final int REASON_UNKNOWN = 0; 1441 1442 /** 1443 * Constant for {@link #importanceReasonCode}: one of the application's 1444 * content providers is being used by another process. The pid of 1445 * the client process is in {@link #importanceReasonPid} and the 1446 * target provider in this process is in 1447 * {@link #importanceReasonComponent}. 1448 */ 1449 public static final int REASON_PROVIDER_IN_USE = 1; 1450 1451 /** 1452 * Constant for {@link #importanceReasonCode}: one of the application's 1453 * content providers is being used by another process. The pid of 1454 * the client process is in {@link #importanceReasonPid} and the 1455 * target provider in this process is in 1456 * {@link #importanceReasonComponent}. 1457 */ 1458 public static final int REASON_SERVICE_IN_USE = 2; 1459 1460 /** 1461 * The reason for {@link #importance}, if any. 1462 */ 1463 public int importanceReasonCode; 1464 1465 /** 1466 * For the specified values of {@link #importanceReasonCode}, this 1467 * is the process ID of the other process that is a client of this 1468 * process. This will be 0 if no other process is using this one. 1469 */ 1470 public int importanceReasonPid; 1471 1472 /** 1473 * For the specified values of {@link #importanceReasonCode}, this 1474 * is the name of the component that is being used in this process. 1475 */ 1476 public ComponentName importanceReasonComponent; 1477 1478 /** 1479 * When {@link importanceReasonPid} is non-0, this is the importance 1480 * of the other pid. @hide 1481 */ 1482 public int importanceReasonImportance; 1483 RunningAppProcessInfo()1484 public RunningAppProcessInfo() { 1485 importance = IMPORTANCE_FOREGROUND; 1486 importanceReasonCode = REASON_UNKNOWN; 1487 } 1488 RunningAppProcessInfo(String pProcessName, int pPid, String pArr[])1489 public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) { 1490 processName = pProcessName; 1491 pid = pPid; 1492 pkgList = pArr; 1493 } 1494 describeContents()1495 public int describeContents() { 1496 return 0; 1497 } 1498 writeToParcel(Parcel dest, int flags)1499 public void writeToParcel(Parcel dest, int flags) { 1500 dest.writeString(processName); 1501 dest.writeInt(pid); 1502 dest.writeInt(uid); 1503 dest.writeStringArray(pkgList); 1504 dest.writeInt(this.flags); 1505 dest.writeInt(lastTrimLevel); 1506 dest.writeInt(importance); 1507 dest.writeInt(lru); 1508 dest.writeInt(importanceReasonCode); 1509 dest.writeInt(importanceReasonPid); 1510 ComponentName.writeToParcel(importanceReasonComponent, dest); 1511 dest.writeInt(importanceReasonImportance); 1512 } 1513 readFromParcel(Parcel source)1514 public void readFromParcel(Parcel source) { 1515 processName = source.readString(); 1516 pid = source.readInt(); 1517 uid = source.readInt(); 1518 pkgList = source.readStringArray(); 1519 flags = source.readInt(); 1520 lastTrimLevel = source.readInt(); 1521 importance = source.readInt(); 1522 lru = source.readInt(); 1523 importanceReasonCode = source.readInt(); 1524 importanceReasonPid = source.readInt(); 1525 importanceReasonComponent = ComponentName.readFromParcel(source); 1526 importanceReasonImportance = source.readInt(); 1527 } 1528 1529 public static final Creator<RunningAppProcessInfo> CREATOR = 1530 new Creator<RunningAppProcessInfo>() { 1531 public RunningAppProcessInfo createFromParcel(Parcel source) { 1532 return new RunningAppProcessInfo(source); 1533 } 1534 public RunningAppProcessInfo[] newArray(int size) { 1535 return new RunningAppProcessInfo[size]; 1536 } 1537 }; 1538 RunningAppProcessInfo(Parcel source)1539 private RunningAppProcessInfo(Parcel source) { 1540 readFromParcel(source); 1541 } 1542 } 1543 1544 /** 1545 * Returns a list of application processes installed on external media 1546 * that are running on the device. 1547 * 1548 * <p><b>Note: this method is only intended for debugging or building 1549 * a user-facing process management UI.</b></p> 1550 * 1551 * @return Returns a list of ApplicationInfo records, or null if none 1552 * This list ordering is not specified. 1553 * @hide 1554 */ getRunningExternalApplications()1555 public List<ApplicationInfo> getRunningExternalApplications() { 1556 try { 1557 return ActivityManagerNative.getDefault().getRunningExternalApplications(); 1558 } catch (RemoteException e) { 1559 return null; 1560 } 1561 } 1562 1563 /** 1564 * Returns a list of application processes that are running on the device. 1565 * 1566 * <p><b>Note: this method is only intended for debugging or building 1567 * a user-facing process management UI.</b></p> 1568 * 1569 * @return Returns a list of RunningAppProcessInfo records, or null if there are no 1570 * running processes (it will not return an empty list). This list ordering is not 1571 * specified. 1572 */ getRunningAppProcesses()1573 public List<RunningAppProcessInfo> getRunningAppProcesses() { 1574 try { 1575 return ActivityManagerNative.getDefault().getRunningAppProcesses(); 1576 } catch (RemoteException e) { 1577 return null; 1578 } 1579 } 1580 1581 /** 1582 * Return global memory state information for the calling process. This 1583 * does not fill in all fields of the {@link RunningAppProcessInfo}. The 1584 * only fields that will be filled in are 1585 * {@link RunningAppProcessInfo#pid}, 1586 * {@link RunningAppProcessInfo#uid}, 1587 * {@link RunningAppProcessInfo#lastTrimLevel}, 1588 * {@link RunningAppProcessInfo#importance}, 1589 * {@link RunningAppProcessInfo#lru}, and 1590 * {@link RunningAppProcessInfo#importanceReasonCode}. 1591 */ getMyMemoryState(RunningAppProcessInfo outState)1592 static public void getMyMemoryState(RunningAppProcessInfo outState) { 1593 try { 1594 ActivityManagerNative.getDefault().getMyMemoryState(outState); 1595 } catch (RemoteException e) { 1596 } 1597 } 1598 1599 /** 1600 * Return information about the memory usage of one or more processes. 1601 * 1602 * <p><b>Note: this method is only intended for debugging or building 1603 * a user-facing process management UI.</b></p> 1604 * 1605 * @param pids The pids of the processes whose memory usage is to be 1606 * retrieved. 1607 * @return Returns an array of memory information, one for each 1608 * requested pid. 1609 */ getProcessMemoryInfo(int[] pids)1610 public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) { 1611 try { 1612 return ActivityManagerNative.getDefault().getProcessMemoryInfo(pids); 1613 } catch (RemoteException e) { 1614 return null; 1615 } 1616 } 1617 1618 /** 1619 * @deprecated This is now just a wrapper for 1620 * {@link #killBackgroundProcesses(String)}; the previous behavior here 1621 * is no longer available to applications because it allows them to 1622 * break other applications by removing their alarms, stopping their 1623 * services, etc. 1624 */ 1625 @Deprecated restartPackage(String packageName)1626 public void restartPackage(String packageName) { 1627 killBackgroundProcesses(packageName); 1628 } 1629 1630 /** 1631 * Have the system immediately kill all background processes associated 1632 * with the given package. This is the same as the kernel killing those 1633 * processes to reclaim memory; the system will take care of restarting 1634 * these processes in the future as needed. 1635 * 1636 * <p>You must hold the permission 1637 * {@link android.Manifest.permission#KILL_BACKGROUND_PROCESSES} to be able to 1638 * call this method. 1639 * 1640 * @param packageName The name of the package whose processes are to 1641 * be killed. 1642 */ killBackgroundProcesses(String packageName)1643 public void killBackgroundProcesses(String packageName) { 1644 try { 1645 ActivityManagerNative.getDefault().killBackgroundProcesses(packageName); 1646 } catch (RemoteException e) { 1647 } 1648 } 1649 1650 /** 1651 * Have the system perform a force stop of everything associated with 1652 * the given application package. All processes that share its uid 1653 * will be killed, all services it has running stopped, all activities 1654 * removed, etc. In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED} 1655 * broadcast will be sent, so that any of its registered alarms can 1656 * be stopped, notifications removed, etc. 1657 * 1658 * <p>You must hold the permission 1659 * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to 1660 * call this method. 1661 * 1662 * @param packageName The name of the package to be stopped. 1663 * 1664 * @hide This is not available to third party applications due to 1665 * it allowing them to break other applications by stopping their 1666 * services, removing their alarms, etc. 1667 */ forceStopPackage(String packageName)1668 public void forceStopPackage(String packageName) { 1669 try { 1670 ActivityManagerNative.getDefault().forceStopPackage(packageName); 1671 } catch (RemoteException e) { 1672 } 1673 } 1674 1675 /** 1676 * Get the device configuration attributes. 1677 */ getDeviceConfigurationInfo()1678 public ConfigurationInfo getDeviceConfigurationInfo() { 1679 try { 1680 return ActivityManagerNative.getDefault().getDeviceConfigurationInfo(); 1681 } catch (RemoteException e) { 1682 } 1683 return null; 1684 } 1685 1686 /** 1687 * Get the preferred density of icons for the launcher. This is used when 1688 * custom drawables are created (e.g., for shortcuts). 1689 * 1690 * @return density in terms of DPI 1691 */ getLauncherLargeIconDensity()1692 public int getLauncherLargeIconDensity() { 1693 final Resources res = mContext.getResources(); 1694 final int density = res.getDisplayMetrics().densityDpi; 1695 final int sw = res.getConfiguration().smallestScreenWidthDp; 1696 1697 if (sw < 600) { 1698 // Smaller than approx 7" tablets, use the regular icon size. 1699 return density; 1700 } 1701 1702 switch (density) { 1703 case DisplayMetrics.DENSITY_LOW: 1704 return DisplayMetrics.DENSITY_MEDIUM; 1705 case DisplayMetrics.DENSITY_MEDIUM: 1706 return DisplayMetrics.DENSITY_HIGH; 1707 case DisplayMetrics.DENSITY_TV: 1708 return DisplayMetrics.DENSITY_XHIGH; 1709 case DisplayMetrics.DENSITY_HIGH: 1710 return DisplayMetrics.DENSITY_XHIGH; 1711 case DisplayMetrics.DENSITY_XHIGH: 1712 return DisplayMetrics.DENSITY_XXHIGH; 1713 case DisplayMetrics.DENSITY_XXHIGH: 1714 return DisplayMetrics.DENSITY_XHIGH * 2; 1715 default: 1716 // The density is some abnormal value. Return some other 1717 // abnormal value that is a reasonable scaling of it. 1718 return (int)((density*1.5f)+.5f); 1719 } 1720 } 1721 1722 /** 1723 * Get the preferred launcher icon size. This is used when custom drawables 1724 * are created (e.g., for shortcuts). 1725 * 1726 * @return dimensions of square icons in terms of pixels 1727 */ getLauncherLargeIconSize()1728 public int getLauncherLargeIconSize() { 1729 final Resources res = mContext.getResources(); 1730 final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size); 1731 final int sw = res.getConfiguration().smallestScreenWidthDp; 1732 1733 if (sw < 600) { 1734 // Smaller than approx 7" tablets, use the regular icon size. 1735 return size; 1736 } 1737 1738 final int density = res.getDisplayMetrics().densityDpi; 1739 1740 switch (density) { 1741 case DisplayMetrics.DENSITY_LOW: 1742 return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW; 1743 case DisplayMetrics.DENSITY_MEDIUM: 1744 return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM; 1745 case DisplayMetrics.DENSITY_TV: 1746 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH; 1747 case DisplayMetrics.DENSITY_HIGH: 1748 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH; 1749 case DisplayMetrics.DENSITY_XHIGH: 1750 return (size * DisplayMetrics.DENSITY_XXHIGH) / DisplayMetrics.DENSITY_XHIGH; 1751 case DisplayMetrics.DENSITY_XXHIGH: 1752 return (size * DisplayMetrics.DENSITY_XHIGH*2) / DisplayMetrics.DENSITY_XXHIGH; 1753 default: 1754 // The density is some abnormal value. Return some other 1755 // abnormal value that is a reasonable scaling of it. 1756 return (int)((size*1.5f) + .5f); 1757 } 1758 } 1759 1760 /** 1761 * Returns "true" if the user interface is currently being messed with 1762 * by a monkey. 1763 */ isUserAMonkey()1764 public static boolean isUserAMonkey() { 1765 try { 1766 return ActivityManagerNative.getDefault().isUserAMonkey(); 1767 } catch (RemoteException e) { 1768 } 1769 return false; 1770 } 1771 1772 /** 1773 * Returns "true" if device is running in a test harness. 1774 */ isRunningInTestHarness()1775 public static boolean isRunningInTestHarness() { 1776 return SystemProperties.getBoolean("ro.test_harness", false); 1777 } 1778 1779 /** 1780 * Returns the launch count of each installed package. 1781 * 1782 * @hide 1783 */ getAllPackageLaunchCounts()1784 public Map<String, Integer> getAllPackageLaunchCounts() { 1785 try { 1786 IUsageStats usageStatsService = IUsageStats.Stub.asInterface( 1787 ServiceManager.getService("usagestats")); 1788 if (usageStatsService == null) { 1789 return new HashMap<String, Integer>(); 1790 } 1791 1792 PkgUsageStats[] allPkgUsageStats = usageStatsService.getAllPkgUsageStats(); 1793 if (allPkgUsageStats == null) { 1794 return new HashMap<String, Integer>(); 1795 } 1796 1797 Map<String, Integer> launchCounts = new HashMap<String, Integer>(); 1798 for (PkgUsageStats pkgUsageStats : allPkgUsageStats) { 1799 launchCounts.put(pkgUsageStats.packageName, pkgUsageStats.launchCount); 1800 } 1801 1802 return launchCounts; 1803 } catch (RemoteException e) { 1804 Log.w(TAG, "Could not query launch counts", e); 1805 return new HashMap<String, Integer>(); 1806 } 1807 } 1808 1809 /** @hide */ checkComponentPermission(String permission, int uid, int owningUid, boolean exported)1810 public static int checkComponentPermission(String permission, int uid, 1811 int owningUid, boolean exported) { 1812 // Root, system server get to do everything. 1813 if (uid == 0 || uid == Process.SYSTEM_UID) { 1814 return PackageManager.PERMISSION_GRANTED; 1815 } 1816 // Isolated processes don't get any permissions. 1817 if (UserId.isIsolated(uid)) { 1818 return PackageManager.PERMISSION_DENIED; 1819 } 1820 // If there is a uid that owns whatever is being accessed, it has 1821 // blanket access to it regardless of the permissions it requires. 1822 if (owningUid >= 0 && UserId.isSameApp(uid, owningUid)) { 1823 return PackageManager.PERMISSION_GRANTED; 1824 } 1825 // If the target is not exported, then nobody else can get to it. 1826 if (!exported) { 1827 Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid); 1828 return PackageManager.PERMISSION_DENIED; 1829 } 1830 if (permission == null) { 1831 return PackageManager.PERMISSION_GRANTED; 1832 } 1833 try { 1834 return AppGlobals.getPackageManager() 1835 .checkUidPermission(permission, uid); 1836 } catch (RemoteException e) { 1837 // Should never happen, but if it does... deny! 1838 Slog.e(TAG, "PackageManager is dead?!?", e); 1839 } 1840 return PackageManager.PERMISSION_DENIED; 1841 } 1842 1843 /** 1844 * Returns the usage statistics of each installed package. 1845 * 1846 * @hide 1847 */ getAllPackageUsageStats()1848 public PkgUsageStats[] getAllPackageUsageStats() { 1849 try { 1850 IUsageStats usageStatsService = IUsageStats.Stub.asInterface( 1851 ServiceManager.getService("usagestats")); 1852 if (usageStatsService != null) { 1853 return usageStatsService.getAllPkgUsageStats(); 1854 } 1855 } catch (RemoteException e) { 1856 Log.w(TAG, "Could not query usage stats", e); 1857 } 1858 return new PkgUsageStats[0]; 1859 } 1860 1861 /** 1862 * @param userid the user's id. Zero indicates the default user 1863 * @hide 1864 */ switchUser(int userid)1865 public boolean switchUser(int userid) { 1866 try { 1867 return ActivityManagerNative.getDefault().switchUser(userid); 1868 } catch (RemoteException e) { 1869 return false; 1870 } 1871 } 1872 } 1873