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