1 /* 2 * Copyright (C) 2013 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 com.android.server.am; 18 19 import static android.Manifest.permission.START_ANY_ACTIVITY; 20 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 21 import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; 22 import static android.content.pm.PackageManager.PERMISSION_GRANTED; 23 import static com.android.server.am.ActivityManagerService.localLOGV; 24 import static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION; 25 import static com.android.server.am.ActivityManagerService.DEBUG_FOCUS; 26 import static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; 27 import static com.android.server.am.ActivityManagerService.DEBUG_RESULTS; 28 import static com.android.server.am.ActivityManagerService.DEBUG_STACK; 29 import static com.android.server.am.ActivityManagerService.DEBUG_SWITCH; 30 import static com.android.server.am.ActivityManagerService.DEBUG_TASKS; 31 import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; 32 import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; 33 import static com.android.server.am.ActivityManagerService.TAG; 34 35 import android.app.Activity; 36 import android.app.ActivityManager; 37 import android.app.ActivityOptions; 38 import android.app.AppGlobals; 39 import android.app.IActivityManager; 40 import android.app.IApplicationThread; 41 import android.app.IThumbnailReceiver; 42 import android.app.PendingIntent; 43 import android.app.ActivityManager.RunningTaskInfo; 44 import android.app.IActivityManager.WaitResult; 45 import android.app.ResultInfo; 46 import android.content.ComponentName; 47 import android.content.Context; 48 import android.content.IIntentSender; 49 import android.content.Intent; 50 import android.content.IntentSender; 51 import android.content.pm.ActivityInfo; 52 import android.content.pm.ApplicationInfo; 53 import android.content.pm.PackageManager; 54 import android.content.pm.ResolveInfo; 55 import android.content.res.Configuration; 56 import android.os.Binder; 57 import android.os.Bundle; 58 import android.os.Debug; 59 import android.os.Handler; 60 import android.os.IBinder; 61 import android.os.Looper; 62 import android.os.Message; 63 import android.os.ParcelFileDescriptor; 64 import android.os.PowerManager; 65 import android.os.Process; 66 import android.os.RemoteException; 67 import android.os.SystemClock; 68 import android.os.UserHandle; 69 import android.util.EventLog; 70 import android.util.Slog; 71 import android.util.SparseIntArray; 72 73 import com.android.internal.app.HeavyWeightSwitcherActivity; 74 import com.android.internal.os.TransferPipe; 75 import com.android.server.am.ActivityManagerService.PendingActivityLaunch; 76 import com.android.server.am.ActivityStack.ActivityState; 77 import com.android.server.wm.StackBox; 78 import com.android.server.wm.WindowManagerService; 79 80 import java.io.FileDescriptor; 81 import java.io.IOException; 82 import java.io.PrintWriter; 83 import java.util.ArrayList; 84 import java.util.List; 85 86 public final class ActivityStackSupervisor { 87 static final boolean DEBUG = ActivityManagerService.DEBUG || false; 88 static final boolean DEBUG_ADD_REMOVE = DEBUG || false; 89 static final boolean DEBUG_APP = DEBUG || false; 90 static final boolean DEBUG_SAVED_STATE = DEBUG || false; 91 static final boolean DEBUG_STATES = DEBUG || false; 92 static final boolean DEBUG_IDLE = DEBUG || false; 93 94 public static final int HOME_STACK_ID = 0; 95 96 /** How long we wait until giving up on the last activity telling us it is idle. */ 97 static final int IDLE_TIMEOUT = 10*1000; 98 99 /** How long we can hold the sleep wake lock before giving up. */ 100 static final int SLEEP_TIMEOUT = 5*1000; 101 102 // How long we can hold the launch wake lock before giving up. 103 static final int LAUNCH_TIMEOUT = 10*1000; 104 105 static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; 106 static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; 107 static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; 108 static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; 109 static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; 110 111 // For debugging to make sure the caller when acquiring/releasing our 112 // wake lock is the system process. 113 static final boolean VALIDATE_WAKE_LOCK_CALLER = false; 114 115 final ActivityManagerService mService; 116 final Context mContext; 117 final Looper mLooper; 118 119 final ActivityStackSupervisorHandler mHandler; 120 121 /** Short cut */ 122 WindowManagerService mWindowManager; 123 124 /** Dismiss the keyguard after the next activity is displayed? */ 125 boolean mDismissKeyguardOnNextActivity = false; 126 127 /** Identifier counter for all ActivityStacks */ 128 private int mLastStackId = HOME_STACK_ID; 129 130 /** Task identifier that activities are currently being started in. Incremented each time a 131 * new task is created. */ 132 private int mCurTaskId = 0; 133 134 /** The current user */ 135 private int mCurrentUser; 136 137 /** The stack containing the launcher app */ 138 private ActivityStack mHomeStack; 139 140 /** The non-home stack currently receiving input or launching the next activity. If home is 141 * in front then mHomeStack overrides mFocusedStack. 142 * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */ 143 private ActivityStack mFocusedStack; 144 145 /** All the non-launcher stacks */ 146 private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 147 148 private static final int STACK_STATE_HOME_IN_FRONT = 0; 149 private static final int STACK_STATE_HOME_TO_BACK = 1; 150 private static final int STACK_STATE_HOME_IN_BACK = 2; 151 private static final int STACK_STATE_HOME_TO_FRONT = 3; 152 private int mStackState = STACK_STATE_HOME_IN_FRONT; 153 154 /** List of activities that are waiting for a new activity to become visible before completing 155 * whatever operation they are supposed to do. */ 156 final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>(); 157 158 /** List of processes waiting to find out about the next visible activity. */ 159 final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = 160 new ArrayList<IActivityManager.WaitResult>(); 161 162 /** List of processes waiting to find out about the next launched activity. */ 163 final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = 164 new ArrayList<IActivityManager.WaitResult>(); 165 166 /** List of activities that are ready to be stopped, but waiting for the next activity to 167 * settle down before doing so. */ 168 final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>(); 169 170 /** List of activities that are ready to be finished, but waiting for the previous activity to 171 * settle down before doing so. It contains ActivityRecord objects. */ 172 final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>(); 173 174 /** List of activities that are in the process of going to sleep. */ 175 final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>(); 176 177 /** List of ActivityRecord objects that have been finished and must still report back to a 178 * pending thumbnail receiver. */ 179 final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>(); 180 181 /** Used on user changes */ 182 final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>(); 183 184 /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity 185 * is being brought in front of us. */ 186 boolean mUserLeaving = false; 187 188 /** Set when we have taken too long waiting to go to sleep. */ 189 boolean mSleepTimeout = false; 190 191 /** 192 * We don't want to allow the device to go to sleep while in the process 193 * of launching an activity. This is primarily to allow alarm intent 194 * receivers to launch an activity and get that to run before the device 195 * goes back to sleep. 196 */ 197 final PowerManager.WakeLock mLaunchingActivity; 198 199 /** 200 * Set when the system is going to sleep, until we have 201 * successfully paused the current activity and released our wake lock. 202 * At that point the system is allowed to actually sleep. 203 */ 204 final PowerManager.WakeLock mGoingToSleep; 205 206 /** Stack id of the front stack when user switched, indexed by userId. */ 207 SparseIntArray mUserStackInFront = new SparseIntArray(2); 208 209 public ActivityStackSupervisor(ActivityManagerService service, Context context, 210 Looper looper) { 211 mService = service; 212 mContext = context; 213 mLooper = looper; 214 PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 215 mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 216 mHandler = new ActivityStackSupervisorHandler(looper); 217 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 218 throw new IllegalStateException("Calling must be system uid"); 219 } 220 mLaunchingActivity = 221 pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 222 mLaunchingActivity.setReferenceCounted(false); 223 } 224 225 void setWindowManager(WindowManagerService wm) { 226 mWindowManager = wm; 227 mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID); 228 mStacks.add(mHomeStack); 229 } 230 231 void dismissKeyguard() { 232 if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(""); 233 if (mDismissKeyguardOnNextActivity) { 234 mDismissKeyguardOnNextActivity = false; 235 mWindowManager.dismissKeyguard(); 236 } 237 } 238 239 ActivityStack getFocusedStack() { 240 if (mFocusedStack == null) { 241 return mHomeStack; 242 } 243 switch (mStackState) { 244 case STACK_STATE_HOME_IN_FRONT: 245 case STACK_STATE_HOME_TO_FRONT: 246 return mHomeStack; 247 case STACK_STATE_HOME_IN_BACK: 248 case STACK_STATE_HOME_TO_BACK: 249 default: 250 return mFocusedStack; 251 } 252 } 253 254 ActivityStack getLastStack() { 255 switch (mStackState) { 256 case STACK_STATE_HOME_IN_FRONT: 257 case STACK_STATE_HOME_TO_BACK: 258 return mHomeStack; 259 case STACK_STATE_HOME_TO_FRONT: 260 case STACK_STATE_HOME_IN_BACK: 261 default: 262 return mFocusedStack; 263 } 264 } 265 266 boolean isFrontStack(ActivityStack stack) { 267 return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack()); 268 } 269 270 void moveHomeStack(boolean toFront) { 271 final boolean homeInFront = isFrontStack(mHomeStack); 272 if (homeInFront ^ toFront) { 273 if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" + 274 stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ? 275 STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT)); 276 mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT; 277 } 278 } 279 280 void moveHomeToTop() { 281 moveHomeStack(true); 282 mHomeStack.moveHomeTaskToTop(); 283 } 284 285 boolean resumeHomeActivity(ActivityRecord prev) { 286 moveHomeToTop(); 287 if (prev != null) { 288 prev.task.mOnTopOfHome = false; 289 } 290 ActivityRecord r = mHomeStack.topRunningActivityLocked(null); 291 if (r != null && r.isHomeActivity()) { 292 mService.setFocusedActivityLocked(r); 293 return resumeTopActivitiesLocked(mHomeStack, prev, null); 294 } 295 return mService.startHomeActivityLocked(mCurrentUser); 296 } 297 298 void setDismissKeyguard(boolean dismiss) { 299 if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss); 300 mDismissKeyguardOnNextActivity = dismiss; 301 } 302 303 TaskRecord anyTaskForIdLocked(int id) { 304 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 305 ActivityStack stack = mStacks.get(stackNdx); 306 TaskRecord task = stack.taskForIdLocked(id); 307 if (task != null) { 308 return task; 309 } 310 } 311 return null; 312 } 313 314 ActivityRecord isInAnyStackLocked(IBinder token) { 315 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 316 final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token); 317 if (r != null) { 318 return r; 319 } 320 } 321 return null; 322 } 323 324 int getNextTaskId() { 325 do { 326 mCurTaskId++; 327 if (mCurTaskId <= 0) { 328 mCurTaskId = 1; 329 } 330 } while (anyTaskForIdLocked(mCurTaskId) != null); 331 return mCurTaskId; 332 } 333 334 void removeTask(TaskRecord task) { 335 mWindowManager.removeTask(task.taskId); 336 final ActivityStack stack = task.stack; 337 final ActivityRecord r = stack.mResumedActivity; 338 if (r != null && r.task == task) { 339 stack.mResumedActivity = null; 340 } 341 if (stack.removeTask(task) && !stack.isHomeStack()) { 342 if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack); 343 mStacks.remove(stack); 344 final int stackId = stack.mStackId; 345 final int nextStackId = mWindowManager.removeStack(stackId); 346 // TODO: Perhaps we need to let the ActivityManager determine the next focus... 347 if (mFocusedStack == null || mFocusedStack.mStackId == stackId) { 348 // If this is the last app stack, set mFocusedStack to null. 349 mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId); 350 } 351 } 352 } 353 354 ActivityRecord resumedAppLocked() { 355 ActivityStack stack = getFocusedStack(); 356 if (stack == null) { 357 return null; 358 } 359 ActivityRecord resumedActivity = stack.mResumedActivity; 360 if (resumedActivity == null || resumedActivity.app == null) { 361 resumedActivity = stack.mPausingActivity; 362 if (resumedActivity == null || resumedActivity.app == null) { 363 resumedActivity = stack.topRunningActivityLocked(null); 364 } 365 } 366 return resumedActivity; 367 } 368 369 boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception { 370 boolean didSomething = false; 371 final String processName = app.processName; 372 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 373 final ActivityStack stack = mStacks.get(stackNdx); 374 if (!isFrontStack(stack)) { 375 continue; 376 } 377 ActivityRecord hr = stack.topRunningActivityLocked(null); 378 if (hr != null) { 379 if (hr.app == null && app.uid == hr.info.applicationInfo.uid 380 && processName.equals(hr.processName)) { 381 try { 382 if (headless) { 383 Slog.e(TAG, "Starting activities not supported on headless device: " 384 + hr); 385 } else if (realStartActivityLocked(hr, app, true, true)) { 386 didSomething = true; 387 } 388 } catch (Exception e) { 389 Slog.w(TAG, "Exception in new application when starting activity " 390 + hr.intent.getComponent().flattenToShortString(), e); 391 throw e; 392 } 393 } 394 } 395 } 396 if (!didSomething) { 397 ensureActivitiesVisibleLocked(null, 0); 398 } 399 return didSomething; 400 } 401 402 boolean allResumedActivitiesIdle() { 403 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 404 final ActivityStack stack = mStacks.get(stackNdx); 405 if (!isFrontStack(stack)) { 406 continue; 407 } 408 final ActivityRecord resumedActivity = stack.mResumedActivity; 409 if (resumedActivity == null || !resumedActivity.idle) { 410 return false; 411 } 412 } 413 return true; 414 } 415 416 boolean allResumedActivitiesComplete() { 417 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 418 final ActivityStack stack = mStacks.get(stackNdx); 419 if (isFrontStack(stack)) { 420 final ActivityRecord r = stack.mResumedActivity; 421 if (r != null && r.state != ActivityState.RESUMED) { 422 return false; 423 } 424 } 425 } 426 // TODO: Not sure if this should check if all Paused are complete too. 427 switch (mStackState) { 428 case STACK_STATE_HOME_TO_BACK: 429 if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + 430 stackStateToString(STACK_STATE_HOME_TO_BACK) + " new=" + 431 stackStateToString(STACK_STATE_HOME_IN_BACK)); 432 mStackState = STACK_STATE_HOME_IN_BACK; 433 break; 434 case STACK_STATE_HOME_TO_FRONT: 435 if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + 436 stackStateToString(STACK_STATE_HOME_TO_FRONT) + " new=" + 437 stackStateToString(STACK_STATE_HOME_IN_FRONT)); 438 mStackState = STACK_STATE_HOME_IN_FRONT; 439 break; 440 } 441 return true; 442 } 443 444 boolean allResumedActivitiesVisible() { 445 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 446 final ActivityStack stack = mStacks.get(stackNdx); 447 final ActivityRecord r = stack.mResumedActivity; 448 if (r != null && (!r.nowVisible || r.waitingVisible)) { 449 return false; 450 } 451 } 452 return true; 453 } 454 455 /** 456 * Pause all activities in either all of the stacks or just the back stacks. 457 * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). 458 * @return true if any activity was paused as a result of this call. 459 */ 460 boolean pauseBackStacks(boolean userLeaving) { 461 boolean someActivityPaused = false; 462 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 463 final ActivityStack stack = mStacks.get(stackNdx); 464 if (!isFrontStack(stack) && stack.mResumedActivity != null) { 465 if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack + 466 " mResumedActivity=" + stack.mResumedActivity); 467 stack.startPausingLocked(userLeaving, false); 468 someActivityPaused = true; 469 } 470 } 471 return someActivityPaused; 472 } 473 474 boolean allPausedActivitiesComplete() { 475 boolean pausing = true; 476 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 477 final ActivityStack stack = mStacks.get(stackNdx); 478 final ActivityRecord r = stack.mPausingActivity; 479 if (r != null && r.state != ActivityState.PAUSED 480 && r.state != ActivityState.STOPPED 481 && r.state != ActivityState.STOPPING) { 482 if (DEBUG_STATES) { 483 Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 484 pausing = false; 485 } else { 486 return false; 487 } 488 } 489 } 490 return pausing; 491 } 492 493 void reportActivityVisibleLocked(ActivityRecord r) { 494 for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 495 WaitResult w = mWaitingActivityVisible.get(i); 496 w.timeout = false; 497 if (r != null) { 498 w.who = new ComponentName(r.info.packageName, r.info.name); 499 } 500 w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 501 w.thisTime = w.totalTime; 502 } 503 mService.notifyAll(); 504 dismissKeyguard(); 505 } 506 507 void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 508 long thisTime, long totalTime) { 509 for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 510 WaitResult w = mWaitingActivityLaunched.remove(i); 511 w.timeout = timeout; 512 if (r != null) { 513 w.who = new ComponentName(r.info.packageName, r.info.name); 514 } 515 w.thisTime = thisTime; 516 w.totalTime = totalTime; 517 } 518 mService.notifyAll(); 519 } 520 521 ActivityRecord topRunningActivityLocked() { 522 final ActivityStack focusedStack = getFocusedStack(); 523 ActivityRecord r = focusedStack.topRunningActivityLocked(null); 524 if (r != null) { 525 return r; 526 } 527 528 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 529 final ActivityStack stack = mStacks.get(stackNdx); 530 if (stack != focusedStack && isFrontStack(stack)) { 531 r = stack.topRunningActivityLocked(null); 532 if (r != null) { 533 return r; 534 } 535 } 536 } 537 return null; 538 } 539 540 ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, 541 PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { 542 ActivityRecord r = null; 543 544 // Gather all of the running tasks for each stack into runningTaskLists. 545 final int numStacks = mStacks.size(); 546 ArrayList<RunningTaskInfo>[] runningTaskLists = new ArrayList[numStacks]; 547 for (int stackNdx = numStacks - 1; stackNdx >= 0; --stackNdx) { 548 final ActivityStack stack = mStacks.get(stackNdx); 549 ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>(); 550 runningTaskLists[stackNdx] = stackTaskList; 551 final ActivityRecord ar = stack.getTasksLocked(receiver, pending, stackTaskList); 552 if (isFrontStack(stack)) { 553 r = ar; 554 } 555 } 556 557 // The lists are already sorted from most recent to oldest. Just pull the most recent off 558 // each list and add it to list. Stop when all lists are empty or maxNum reached. 559 while (maxNum > 0) { 560 long mostRecentActiveTime = Long.MIN_VALUE; 561 ArrayList<RunningTaskInfo> selectedStackList = null; 562 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 563 ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists[stackNdx]; 564 if (!stackTaskList.isEmpty()) { 565 final long lastActiveTime = stackTaskList.get(0).lastActiveTime; 566 if (lastActiveTime > mostRecentActiveTime) { 567 mostRecentActiveTime = lastActiveTime; 568 selectedStackList = stackTaskList; 569 } 570 } 571 } 572 if (selectedStackList != null) { 573 list.add(selectedStackList.remove(0)); 574 --maxNum; 575 } else { 576 break; 577 } 578 } 579 580 return r; 581 } 582 583 ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 584 String profileFile, ParcelFileDescriptor profileFd, int userId) { 585 // Collect information about the target of the Intent. 586 ActivityInfo aInfo; 587 try { 588 ResolveInfo rInfo = 589 AppGlobals.getPackageManager().resolveIntent( 590 intent, resolvedType, 591 PackageManager.MATCH_DEFAULT_ONLY 592 | ActivityManagerService.STOCK_PM_FLAGS, userId); 593 aInfo = rInfo != null ? rInfo.activityInfo : null; 594 } catch (RemoteException e) { 595 aInfo = null; 596 } 597 598 if (aInfo != null) { 599 // Store the found target back into the intent, because now that 600 // we have it we never want to do this again. For example, if the 601 // user navigates back to this point in the history, we should 602 // always restart the exact same activity. 603 intent.setComponent(new ComponentName( 604 aInfo.applicationInfo.packageName, aInfo.name)); 605 606 // Don't debug things in the system process 607 if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 608 if (!aInfo.processName.equals("system")) { 609 mService.setDebugApp(aInfo.processName, true, false); 610 } 611 } 612 613 if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 614 if (!aInfo.processName.equals("system")) { 615 mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 616 } 617 } 618 619 if (profileFile != null) { 620 if (!aInfo.processName.equals("system")) { 621 mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 622 profileFile, profileFd, 623 (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0); 624 } 625 } 626 } 627 return aInfo; 628 } 629 630 void startHomeActivity(Intent intent, ActivityInfo aInfo) { 631 moveHomeToTop(); 632 startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0, 633 null, false, null); 634 } 635 636 final int startActivityMayWait(IApplicationThread caller, int callingUid, 637 String callingPackage, Intent intent, String resolvedType, IBinder resultTo, 638 String resultWho, int requestCode, int startFlags, String profileFile, 639 ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config, 640 Bundle options, int userId) { 641 // Refuse possible leaked file descriptors 642 if (intent != null && intent.hasFileDescriptors()) { 643 throw new IllegalArgumentException("File descriptors passed in Intent"); 644 } 645 boolean componentSpecified = intent.getComponent() != null; 646 647 // Don't modify the client's object! 648 intent = new Intent(intent); 649 650 // Collect information about the target of the Intent. 651 ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 652 profileFile, profileFd, userId); 653 654 synchronized (mService) { 655 int callingPid; 656 if (callingUid >= 0) { 657 callingPid = -1; 658 } else if (caller == null) { 659 callingPid = Binder.getCallingPid(); 660 callingUid = Binder.getCallingUid(); 661 } else { 662 callingPid = callingUid = -1; 663 } 664 665 final ActivityStack stack = getFocusedStack(); 666 stack.mConfigWillChange = config != null 667 && mService.mConfiguration.diff(config) != 0; 668 if (DEBUG_CONFIGURATION) Slog.v(TAG, 669 "Starting activity when config will change = " + stack.mConfigWillChange); 670 671 final long origId = Binder.clearCallingIdentity(); 672 673 if (aInfo != null && 674 (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 675 // This may be a heavy-weight process! Check to see if we already 676 // have another, different heavy-weight process running. 677 if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 678 if (mService.mHeavyWeightProcess != null && 679 (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 680 !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 681 int realCallingUid = callingUid; 682 if (caller != null) { 683 ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 684 if (callerApp != null) { 685 realCallingUid = callerApp.info.uid; 686 } else { 687 Slog.w(TAG, "Unable to find app for caller " + caller 688 + " (pid=" + callingPid + ") when starting: " 689 + intent.toString()); 690 ActivityOptions.abort(options); 691 return ActivityManager.START_PERMISSION_DENIED; 692 } 693 } 694 695 IIntentSender target = mService.getIntentSenderLocked( 696 ActivityManager.INTENT_SENDER_ACTIVITY, "android", 697 realCallingUid, userId, null, null, 0, new Intent[] { intent }, 698 new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 699 | PendingIntent.FLAG_ONE_SHOT, null); 700 701 Intent newIntent = new Intent(); 702 if (requestCode >= 0) { 703 // Caller is requesting a result. 704 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 705 } 706 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 707 new IntentSender(target)); 708 if (mService.mHeavyWeightProcess.activities.size() > 0) { 709 ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 710 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 711 hist.packageName); 712 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 713 hist.task.taskId); 714 } 715 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 716 aInfo.packageName); 717 newIntent.setFlags(intent.getFlags()); 718 newIntent.setClassName("android", 719 HeavyWeightSwitcherActivity.class.getName()); 720 intent = newIntent; 721 resolvedType = null; 722 caller = null; 723 callingUid = Binder.getCallingUid(); 724 callingPid = Binder.getCallingPid(); 725 componentSpecified = true; 726 try { 727 ResolveInfo rInfo = 728 AppGlobals.getPackageManager().resolveIntent( 729 intent, null, 730 PackageManager.MATCH_DEFAULT_ONLY 731 | ActivityManagerService.STOCK_PM_FLAGS, userId); 732 aInfo = rInfo != null ? rInfo.activityInfo : null; 733 aInfo = mService.getActivityInfoForUser(aInfo, userId); 734 } catch (RemoteException e) { 735 aInfo = null; 736 } 737 } 738 } 739 } 740 741 int res = startActivityLocked(caller, intent, resolvedType, 742 aInfo, resultTo, resultWho, requestCode, callingPid, callingUid, 743 callingPackage, startFlags, options, componentSpecified, null); 744 745 if (stack.mConfigWillChange) { 746 // If the caller also wants to switch to a new configuration, 747 // do so now. This allows a clean switch, as we are waiting 748 // for the current activity to pause (so we will not destroy 749 // it), and have not yet started the next activity. 750 mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 751 "updateConfiguration()"); 752 stack.mConfigWillChange = false; 753 if (DEBUG_CONFIGURATION) Slog.v(TAG, 754 "Updating to new configuration after starting activity."); 755 mService.updateConfigurationLocked(config, null, false, false); 756 } 757 758 Binder.restoreCallingIdentity(origId); 759 760 if (outResult != null) { 761 outResult.result = res; 762 if (res == ActivityManager.START_SUCCESS) { 763 mWaitingActivityLaunched.add(outResult); 764 do { 765 try { 766 mService.wait(); 767 } catch (InterruptedException e) { 768 } 769 } while (!outResult.timeout && outResult.who == null); 770 } else if (res == ActivityManager.START_TASK_TO_FRONT) { 771 ActivityRecord r = stack.topRunningActivityLocked(null); 772 if (r.nowVisible) { 773 outResult.timeout = false; 774 outResult.who = new ComponentName(r.info.packageName, r.info.name); 775 outResult.totalTime = 0; 776 outResult.thisTime = 0; 777 } else { 778 outResult.thisTime = SystemClock.uptimeMillis(); 779 mWaitingActivityVisible.add(outResult); 780 do { 781 try { 782 mService.wait(); 783 } catch (InterruptedException e) { 784 } 785 } while (!outResult.timeout && outResult.who == null); 786 } 787 } 788 } 789 790 return res; 791 } 792 } 793 794 final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 795 Intent[] intents, String[] resolvedTypes, IBinder resultTo, 796 Bundle options, int userId) { 797 if (intents == null) { 798 throw new NullPointerException("intents is null"); 799 } 800 if (resolvedTypes == null) { 801 throw new NullPointerException("resolvedTypes is null"); 802 } 803 if (intents.length != resolvedTypes.length) { 804 throw new IllegalArgumentException("intents are length different than resolvedTypes"); 805 } 806 807 808 int callingPid; 809 if (callingUid >= 0) { 810 callingPid = -1; 811 } else if (caller == null) { 812 callingPid = Binder.getCallingPid(); 813 callingUid = Binder.getCallingUid(); 814 } else { 815 callingPid = callingUid = -1; 816 } 817 final long origId = Binder.clearCallingIdentity(); 818 try { 819 synchronized (mService) { 820 ActivityRecord[] outActivity = new ActivityRecord[1]; 821 for (int i=0; i<intents.length; i++) { 822 Intent intent = intents[i]; 823 if (intent == null) { 824 continue; 825 } 826 827 // Refuse possible leaked file descriptors 828 if (intent != null && intent.hasFileDescriptors()) { 829 throw new IllegalArgumentException("File descriptors passed in Intent"); 830 } 831 832 boolean componentSpecified = intent.getComponent() != null; 833 834 // Don't modify the client's object! 835 intent = new Intent(intent); 836 837 // Collect information about the target of the Intent. 838 ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 839 0, null, null, userId); 840 // TODO: New, check if this is correct 841 aInfo = mService.getActivityInfoForUser(aInfo, userId); 842 843 if (aInfo != null && 844 (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) 845 != 0) { 846 throw new IllegalArgumentException( 847 "FLAG_CANT_SAVE_STATE not supported here"); 848 } 849 850 Bundle theseOptions; 851 if (options != null && i == intents.length-1) { 852 theseOptions = options; 853 } else { 854 theseOptions = null; 855 } 856 int res = startActivityLocked(caller, intent, resolvedTypes[i], 857 aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage, 858 0, theseOptions, componentSpecified, outActivity); 859 if (res < 0) { 860 return res; 861 } 862 863 resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 864 } 865 } 866 } finally { 867 Binder.restoreCallingIdentity(origId); 868 } 869 870 return ActivityManager.START_SUCCESS; 871 } 872 873 final boolean realStartActivityLocked(ActivityRecord r, 874 ProcessRecord app, boolean andResume, boolean checkConfig) 875 throws RemoteException { 876 877 r.startFreezingScreenLocked(app, 0); 878 if (false) Slog.d(TAG, "realStartActivity: setting app visibility true"); 879 mWindowManager.setAppVisibility(r.appToken, true); 880 881 // schedule launch ticks to collect information about slow apps. 882 r.startLaunchTickingLocked(); 883 884 // Have the window manager re-evaluate the orientation of 885 // the screen based on the new activity order. Note that 886 // as a result of this, it can call back into the activity 887 // manager with a new orientation. We don't care about that, 888 // because the activity is not currently running so we are 889 // just restarting it anyway. 890 if (checkConfig) { 891 Configuration config = mWindowManager.updateOrientationFromAppTokens( 892 mService.mConfiguration, 893 r.mayFreezeScreenLocked(app) ? r.appToken : null); 894 mService.updateConfigurationLocked(config, r, false, false); 895 } 896 897 r.app = app; 898 app.waitingToKill = null; 899 r.launchCount++; 900 r.lastLaunchTime = SystemClock.uptimeMillis(); 901 902 if (localLOGV) Slog.v(TAG, "Launching: " + r); 903 904 int idx = app.activities.indexOf(r); 905 if (idx < 0) { 906 app.activities.add(r); 907 } 908 mService.updateLruProcessLocked(app, true, null); 909 mService.updateOomAdjLocked(); 910 911 final ActivityStack stack = r.task.stack; 912 try { 913 if (app.thread == null) { 914 throw new RemoteException(); 915 } 916 List<ResultInfo> results = null; 917 List<Intent> newIntents = null; 918 if (andResume) { 919 results = r.results; 920 newIntents = r.newIntents; 921 } 922 if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 923 + " icicle=" + r.icicle 924 + " with results=" + results + " newIntents=" + newIntents 925 + " andResume=" + andResume); 926 if (andResume) { 927 EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 928 r.userId, System.identityHashCode(r), 929 r.task.taskId, r.shortComponentName); 930 } 931 if (r.isHomeActivity() && r.isNotResolverActivity()) { 932 // Home process is the root process of the task. 933 mService.mHomeProcess = r.task.mActivities.get(0).app; 934 } 935 mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 936 r.sleeping = false; 937 r.forceNewConfig = false; 938 mService.showAskCompatModeDialogLocked(r); 939 r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 940 String profileFile = null; 941 ParcelFileDescriptor profileFd = null; 942 boolean profileAutoStop = false; 943 if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 944 if (mService.mProfileProc == null || mService.mProfileProc == app) { 945 mService.mProfileProc = app; 946 profileFile = mService.mProfileFile; 947 profileFd = mService.mProfileFd; 948 profileAutoStop = mService.mAutoStopProfiler; 949 } 950 } 951 app.hasShownUi = true; 952 app.pendingUiClean = true; 953 if (profileFd != null) { 954 try { 955 profileFd = profileFd.dup(); 956 } catch (IOException e) { 957 if (profileFd != null) { 958 try { 959 profileFd.close(); 960 } catch (IOException o) { 961 } 962 profileFd = null; 963 } 964 } 965 } 966 app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 967 app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 968 System.identityHashCode(r), r.info, 969 new Configuration(mService.mConfiguration), r.compat, 970 app.repProcState, r.icicle, results, newIntents, !andResume, 971 mService.isNextTransitionForward(), profileFile, profileFd, 972 profileAutoStop); 973 974 if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 975 // This may be a heavy-weight process! Note that the package 976 // manager will ensure that only activity can run in the main 977 // process of the .apk, which is the only thing that will be 978 // considered heavy-weight. 979 if (app.processName.equals(app.info.packageName)) { 980 if (mService.mHeavyWeightProcess != null 981 && mService.mHeavyWeightProcess != app) { 982 Slog.w(TAG, "Starting new heavy weight process " + app 983 + " when already running " 984 + mService.mHeavyWeightProcess); 985 } 986 mService.mHeavyWeightProcess = app; 987 Message msg = mService.mHandler.obtainMessage( 988 ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 989 msg.obj = r; 990 mService.mHandler.sendMessage(msg); 991 } 992 } 993 994 } catch (RemoteException e) { 995 if (r.launchFailed) { 996 // This is the second time we failed -- finish activity 997 // and give up. 998 Slog.e(TAG, "Second failure launching " 999 + r.intent.getComponent().flattenToShortString() 1000 + ", giving up", e); 1001 mService.appDiedLocked(app, app.pid, app.thread); 1002 stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 1003 "2nd-crash", false); 1004 return false; 1005 } 1006 1007 // This is the first time we failed -- restart process and 1008 // retry. 1009 app.activities.remove(r); 1010 throw e; 1011 } 1012 1013 r.launchFailed = false; 1014 if (stack.updateLRUListLocked(r)) { 1015 Slog.w(TAG, "Activity " + r 1016 + " being launched, but already in LRU list"); 1017 } 1018 1019 if (andResume) { 1020 // As part of the process of launching, ActivityThread also performs 1021 // a resume. 1022 stack.minimalResumeActivityLocked(r); 1023 } else { 1024 // This activity is not starting in the resumed state... which 1025 // should look like we asked it to pause+stop (but remain visible), 1026 // and it has done so and reported back the current icicle and 1027 // other state. 1028 if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 1029 + " (starting in stopped state)"); 1030 r.state = ActivityState.STOPPED; 1031 r.stopped = true; 1032 } 1033 1034 // Launch the new version setup screen if needed. We do this -after- 1035 // launching the initial activity (that is, home), so that it can have 1036 // a chance to initialize itself while in the background, making the 1037 // switch back to it faster and look better. 1038 if (isFrontStack(stack)) { 1039 mService.startSetupActivityLocked(); 1040 } 1041 1042 return true; 1043 } 1044 1045 void startSpecificActivityLocked(ActivityRecord r, 1046 boolean andResume, boolean checkConfig) { 1047 // Is this activity's application already running? 1048 ProcessRecord app = mService.getProcessRecordLocked(r.processName, 1049 r.info.applicationInfo.uid, true); 1050 1051 r.task.stack.setLaunchTime(r); 1052 1053 if (app != null && app.thread != null) { 1054 try { 1055 if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 1056 || !"android".equals(r.info.packageName)) { 1057 // Don't add this if it is a platform component that is marked 1058 // to run in multiple processes, because this is actually 1059 // part of the framework so doesn't make sense to track as a 1060 // separate apk in the process. 1061 app.addPackage(r.info.packageName, mService.mProcessStats); 1062 } 1063 realStartActivityLocked(r, app, andResume, checkConfig); 1064 return; 1065 } catch (RemoteException e) { 1066 Slog.w(TAG, "Exception when starting activity " 1067 + r.intent.getComponent().flattenToShortString(), e); 1068 } 1069 1070 // If a dead object exception was thrown -- fall through to 1071 // restart the application. 1072 } 1073 1074 mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 1075 "activity", r.intent.getComponent(), false, false, true); 1076 } 1077 1078 final int startActivityLocked(IApplicationThread caller, 1079 Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo, 1080 String resultWho, int requestCode, 1081 int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options, 1082 boolean componentSpecified, ActivityRecord[] outActivity) { 1083 int err = ActivityManager.START_SUCCESS; 1084 1085 ProcessRecord callerApp = null; 1086 if (caller != null) { 1087 callerApp = mService.getRecordForAppLocked(caller); 1088 if (callerApp != null) { 1089 callingPid = callerApp.pid; 1090 callingUid = callerApp.info.uid; 1091 } else { 1092 Slog.w(TAG, "Unable to find app for caller " + caller 1093 + " (pid=" + callingPid + ") when starting: " 1094 + intent.toString()); 1095 err = ActivityManager.START_PERMISSION_DENIED; 1096 } 1097 } 1098 1099 if (err == ActivityManager.START_SUCCESS) { 1100 final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 1101 Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 1102 + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); 1103 } 1104 1105 ActivityRecord sourceRecord = null; 1106 ActivityRecord resultRecord = null; 1107 if (resultTo != null) { 1108 sourceRecord = isInAnyStackLocked(resultTo); 1109 if (DEBUG_RESULTS) Slog.v( 1110 TAG, "Will send result to " + resultTo + " " + sourceRecord); 1111 if (sourceRecord != null) { 1112 if (requestCode >= 0 && !sourceRecord.finishing) { 1113 resultRecord = sourceRecord; 1114 } 1115 } 1116 } 1117 ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 1118 1119 int launchFlags = intent.getFlags(); 1120 1121 if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 1122 && sourceRecord != null) { 1123 // Transfer the result target from the source activity to the new 1124 // one being started, including any failures. 1125 if (requestCode >= 0) { 1126 ActivityOptions.abort(options); 1127 return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 1128 } 1129 resultRecord = sourceRecord.resultTo; 1130 resultWho = sourceRecord.resultWho; 1131 requestCode = sourceRecord.requestCode; 1132 sourceRecord.resultTo = null; 1133 if (resultRecord != null) { 1134 resultRecord.removeResultsLocked( 1135 sourceRecord, resultWho, requestCode); 1136 } 1137 if (sourceRecord.launchedFromUid == callingUid) { 1138 // The new activity is being launched from the same uid as the previous 1139 // activity in the flow, and asking to forward its result back to the 1140 // previous. In this case the activity is serving as a trampoline between 1141 // the two, so we also want to update its launchedFromPackage to be the 1142 // same as the previous activity. Note that this is safe, since we know 1143 // these two packages come from the same uid; the caller could just as 1144 // well have supplied that same package name itself. This specifially 1145 // deals with the case of an intent picker/chooser being launched in the app 1146 // flow to redirect to an activity picked by the user, where we want the final 1147 // activity to consider it to have been launched by the previous app activity. 1148 callingPackage = sourceRecord.launchedFromPackage; 1149 } 1150 } 1151 1152 if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 1153 // We couldn't find a class that can handle the given Intent. 1154 // That's the end of that! 1155 err = ActivityManager.START_INTENT_NOT_RESOLVED; 1156 } 1157 1158 if (err == ActivityManager.START_SUCCESS && aInfo == null) { 1159 // We couldn't find the specific class specified in the Intent. 1160 // Also the end of the line. 1161 err = ActivityManager.START_CLASS_NOT_FOUND; 1162 } 1163 1164 if (err != ActivityManager.START_SUCCESS) { 1165 if (resultRecord != null) { 1166 resultStack.sendActivityResultLocked(-1, 1167 resultRecord, resultWho, requestCode, 1168 Activity.RESULT_CANCELED, null); 1169 } 1170 setDismissKeyguard(false); 1171 ActivityOptions.abort(options); 1172 return err; 1173 } 1174 1175 final int startAnyPerm = mService.checkPermission( 1176 START_ANY_ACTIVITY, callingPid, callingUid); 1177 final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 1178 callingUid, aInfo.applicationInfo.uid, aInfo.exported); 1179 if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 1180 if (resultRecord != null) { 1181 resultStack.sendActivityResultLocked(-1, 1182 resultRecord, resultWho, requestCode, 1183 Activity.RESULT_CANCELED, null); 1184 } 1185 setDismissKeyguard(false); 1186 String msg; 1187 if (!aInfo.exported) { 1188 msg = "Permission Denial: starting " + intent.toString() 1189 + " from " + callerApp + " (pid=" + callingPid 1190 + ", uid=" + callingUid + ")" 1191 + " not exported from uid " + aInfo.applicationInfo.uid; 1192 } else { 1193 msg = "Permission Denial: starting " + intent.toString() 1194 + " from " + callerApp + " (pid=" + callingPid 1195 + ", uid=" + callingUid + ")" 1196 + " requires " + aInfo.permission; 1197 } 1198 Slog.w(TAG, msg); 1199 throw new SecurityException(msg); 1200 } 1201 1202 boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1203 callingPid, resolvedType, aInfo.applicationInfo); 1204 1205 if (mService.mController != null) { 1206 try { 1207 // The Intent we give to the watcher has the extra data 1208 // stripped off, since it can contain private information. 1209 Intent watchIntent = intent.cloneFilter(); 1210 abort |= !mService.mController.activityStarting(watchIntent, 1211 aInfo.applicationInfo.packageName); 1212 } catch (RemoteException e) { 1213 mService.mController = null; 1214 } 1215 } 1216 1217 if (abort) { 1218 if (resultRecord != null) { 1219 resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 1220 Activity.RESULT_CANCELED, null); 1221 } 1222 // We pretend to the caller that it was really started, but 1223 // they will just get a cancel result. 1224 setDismissKeyguard(false); 1225 ActivityOptions.abort(options); 1226 return ActivityManager.START_SUCCESS; 1227 } 1228 1229 ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 1230 intent, resolvedType, aInfo, mService.mConfiguration, 1231 resultRecord, resultWho, requestCode, componentSpecified, this); 1232 if (outActivity != null) { 1233 outActivity[0] = r; 1234 } 1235 1236 final ActivityStack stack = getFocusedStack(); 1237 if (stack.mResumedActivity == null 1238 || stack.mResumedActivity.info.applicationInfo.uid != callingUid) { 1239 if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 1240 PendingActivityLaunch pal = 1241 new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 1242 mService.mPendingActivityLaunches.add(pal); 1243 setDismissKeyguard(false); 1244 ActivityOptions.abort(options); 1245 return ActivityManager.START_SWITCHES_CANCELED; 1246 } 1247 } 1248 1249 if (mService.mDidAppSwitch) { 1250 // This is the second allowed switch since we stopped switches, 1251 // so now just generally allow switches. Use case: user presses 1252 // home (switches disabled, switch to home, mDidAppSwitch now true); 1253 // user taps a home icon (coming from home so allowed, we hit here 1254 // and now allow anyone to switch again). 1255 mService.mAppSwitchesAllowedTime = 0; 1256 } else { 1257 mService.mDidAppSwitch = true; 1258 } 1259 1260 mService.doPendingActivityLaunchesLocked(false); 1261 1262 err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options); 1263 1264 if (allPausedActivitiesComplete()) { 1265 // If someone asked to have the keyguard dismissed on the next 1266 // activity start, but we are not actually doing an activity 1267 // switch... just dismiss the keyguard now, because we 1268 // probably want to see whatever is behind it. 1269 dismissKeyguard(); 1270 } 1271 return err; 1272 } 1273 1274 ActivityStack adjustStackFocus(ActivityRecord r) { 1275 final TaskRecord task = r.task; 1276 if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) { 1277 if (task != null) { 1278 final ActivityStack taskStack = task.stack; 1279 if (mFocusedStack != taskStack) { 1280 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1281 "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task); 1282 mFocusedStack = taskStack.isHomeStack() ? null : taskStack; 1283 } else { 1284 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1285 "adjustStackFocus: Focused stack already=" + mFocusedStack); 1286 } 1287 return taskStack; 1288 } 1289 1290 if (mFocusedStack != null) { 1291 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1292 "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1293 return mFocusedStack; 1294 } 1295 1296 for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) { 1297 ActivityStack stack = mStacks.get(stackNdx); 1298 if (!stack.isHomeStack()) { 1299 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1300 "adjustStackFocus: Setting focused stack=" + stack); 1301 mFocusedStack = stack; 1302 return mFocusedStack; 1303 } 1304 } 1305 1306 // Time to create the first app stack for this user. 1307 int stackId = 1308 mService.createStack(-1, HOME_STACK_ID, StackBox.TASK_STACK_GOES_OVER, 1.0f); 1309 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1310 " stackId=" + stackId); 1311 mFocusedStack = getStack(stackId); 1312 return mFocusedStack; 1313 } 1314 return mHomeStack; 1315 } 1316 1317 void setFocusedStack(ActivityRecord r) { 1318 if (r == null) { 1319 return; 1320 } 1321 if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) { 1322 if (mStackState != STACK_STATE_HOME_IN_FRONT) { 1323 if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" + 1324 stackStateToString(mStackState) + " new=" + 1325 stackStateToString(STACK_STATE_HOME_TO_FRONT) + 1326 " Callers=" + Debug.getCallers(3)); 1327 mStackState = STACK_STATE_HOME_TO_FRONT; 1328 } 1329 } else { 1330 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1331 "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task + 1332 " Callers=" + Debug.getCallers(3)); 1333 final ActivityStack taskStack = r.task.stack; 1334 mFocusedStack = taskStack.isHomeStack() ? null : taskStack; 1335 if (mStackState != STACK_STATE_HOME_IN_BACK) { 1336 if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" + 1337 stackStateToString(mStackState) + " new=" + 1338 stackStateToString(STACK_STATE_HOME_TO_BACK) + 1339 " Callers=" + Debug.getCallers(3)); 1340 mStackState = STACK_STATE_HOME_TO_BACK; 1341 } 1342 } 1343 } 1344 1345 final int startActivityUncheckedLocked(ActivityRecord r, 1346 ActivityRecord sourceRecord, int startFlags, boolean doResume, 1347 Bundle options) { 1348 final Intent intent = r.intent; 1349 final int callingUid = r.launchedFromUid; 1350 1351 int launchFlags = intent.getFlags(); 1352 1353 // We'll invoke onUserLeaving before onPause only if the launching 1354 // activity did not explicitly state that this is an automated launch. 1355 mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1356 if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 1357 1358 // If the caller has asked not to resume at this point, we make note 1359 // of this in the record so that we can skip it when trying to find 1360 // the top running activity. 1361 if (!doResume) { 1362 r.delayedResume = true; 1363 } 1364 1365 ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 1366 1367 // If the onlyIfNeeded flag is set, then we can do this if the activity 1368 // being launched is the same as the one making the call... or, as 1369 // a special case, if we do not know the caller then we count the 1370 // current top activity as the caller. 1371 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 1372 ActivityRecord checkedCaller = sourceRecord; 1373 if (checkedCaller == null) { 1374 checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 1375 } 1376 if (!checkedCaller.realActivity.equals(r.realActivity)) { 1377 // Caller is not the same as launcher, so always needed. 1378 startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 1379 } 1380 } 1381 1382 if (sourceRecord == null) { 1383 // This activity is not being started from another... in this 1384 // case we -always- start a new task. 1385 if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1386 Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 1387 "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1388 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1389 } 1390 } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 1391 // The original activity who is starting us is running as a single 1392 // instance... this new activity it is starting must go on its 1393 // own task. 1394 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1395 } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 1396 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 1397 // The activity being started is a single instance... it always 1398 // gets launched into its own task. 1399 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1400 } 1401 1402 ActivityInfo newTaskInfo = null; 1403 Intent newTaskIntent = null; 1404 final ActivityStack sourceStack; 1405 if (sourceRecord != null) { 1406 if (sourceRecord.finishing) { 1407 // If the source is finishing, we can't further count it as our source. This 1408 // is because the task it is associated with may now be empty and on its way out, 1409 // so we don't want to blindly throw it in to that task. Instead we will take 1410 // the NEW_TASK flow and try to find a task for it. But save the task information 1411 // so it can be used when creating the new task. 1412 if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1413 Slog.w(TAG, "startActivity called from finishing " + sourceRecord 1414 + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1415 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1416 newTaskInfo = sourceRecord.info; 1417 newTaskIntent = sourceRecord.task.intent; 1418 } 1419 sourceRecord = null; 1420 sourceStack = null; 1421 } else { 1422 sourceStack = sourceRecord.task.stack; 1423 } 1424 } else { 1425 sourceStack = null; 1426 } 1427 1428 if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1429 // For whatever reason this activity is being launched into a new 1430 // task... yet the caller has requested a result back. Well, that 1431 // is pretty messed up, so instead immediately send back a cancel 1432 // and let the new task continue launched as normal without a 1433 // dependency on its originator. 1434 Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 1435 r.resultTo.task.stack.sendActivityResultLocked(-1, 1436 r.resultTo, r.resultWho, r.requestCode, 1437 Activity.RESULT_CANCELED, null); 1438 r.resultTo = null; 1439 } 1440 1441 boolean addingToTask = false; 1442 boolean movedHome = false; 1443 TaskRecord reuseTask = null; 1444 ActivityStack targetStack; 1445 if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 1446 (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 1447 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 1448 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 1449 // If bring to front is requested, and no result is requested, and 1450 // we can find a task that was started with this same 1451 // component, then instead of launching bring that one to the front. 1452 if (r.resultTo == null) { 1453 // See if there is a task to bring to the front. If this is 1454 // a SINGLE_INSTANCE activity, there can be one and only one 1455 // instance of it in the history, and it is always in its own 1456 // unique task, so we do a special search. 1457 ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 1458 ? findTaskLocked(r) 1459 : findActivityLocked(intent, r.info); 1460 if (intentActivity != null) { 1461 if (r.task == null) { 1462 r.task = intentActivity.task; 1463 } 1464 targetStack = intentActivity.task.stack; 1465 targetStack.mLastPausedActivity = null; 1466 if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack 1467 + " from " + intentActivity); 1468 moveHomeStack(targetStack.isHomeStack()); 1469 if (intentActivity.task.intent == null) { 1470 // This task was started because of movement of 1471 // the activity based on affinity... now that we 1472 // are actually launching it, we can assign the 1473 // base intent. 1474 intentActivity.task.setIntent(intent, r.info); 1475 } 1476 // If the target task is not in the front, then we need 1477 // to bring it to the front... except... well, with 1478 // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 1479 // to have the same behavior as if a new instance was 1480 // being started, which means not bringing it to the front 1481 // if the caller is not itself in the front. 1482 final ActivityStack lastStack = getLastStack(); 1483 ActivityRecord curTop = lastStack == null? 1484 null : lastStack.topRunningNonDelayedActivityLocked(notTop); 1485 if (curTop != null && (curTop.task != intentActivity.task || 1486 curTop.task != lastStack.topTask())) { 1487 r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1488 if (sourceRecord == null || (sourceStack.topActivity() != null && 1489 sourceStack.topActivity().task == sourceRecord.task)) { 1490 // We really do want to push this one into the 1491 // user's face, right now. 1492 movedHome = true; 1493 targetStack.moveTaskToFrontLocked(intentActivity.task, r, options); 1494 if ((launchFlags & 1495 (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 1496 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1497 // Caller wants to appear on home activity. 1498 intentActivity.task.mOnTopOfHome = true; 1499 } 1500 options = null; 1501 } 1502 } 1503 // If the caller has requested that the target task be 1504 // reset, then do so. 1505 if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 1506 intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 1507 } 1508 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 1509 // We don't need to start a new activity, and 1510 // the client said not to do anything if that 1511 // is the case, so this is it! And for paranoia, make 1512 // sure we have correctly resumed the top activity. 1513 if (doResume) { 1514 resumeTopActivitiesLocked(targetStack, null, options); 1515 } else { 1516 ActivityOptions.abort(options); 1517 } 1518 if (r.task == null) Slog.v(TAG, 1519 "startActivityUncheckedLocked: task left null", 1520 new RuntimeException("here").fillInStackTrace()); 1521 return ActivityManager.START_RETURN_INTENT_TO_CALLER; 1522 } 1523 if ((launchFlags & 1524 (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 1525 == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 1526 // The caller has requested to completely replace any 1527 // existing task with its new activity. Well that should 1528 // not be too hard... 1529 reuseTask = intentActivity.task; 1530 reuseTask.performClearTaskLocked(); 1531 reuseTask.setIntent(r.intent, r.info); 1532 } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 1533 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 1534 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 1535 // In this situation we want to remove all activities 1536 // from the task up to the one being started. In most 1537 // cases this means we are resetting the task to its 1538 // initial state. 1539 ActivityRecord top = 1540 intentActivity.task.performClearTaskLocked(r, launchFlags); 1541 if (top != null) { 1542 if (top.frontOfTask) { 1543 // Activity aliases may mean we use different 1544 // intents for the top activity, so make sure 1545 // the task now has the identity of the new 1546 // intent. 1547 top.task.setIntent(r.intent, r.info); 1548 } 1549 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 1550 r, top.task); 1551 top.deliverNewIntentLocked(callingUid, r.intent); 1552 } else { 1553 // A special case: we need to 1554 // start the activity because it is not currently 1555 // running, and the caller has asked to clear the 1556 // current task to have this activity at the top. 1557 addingToTask = true; 1558 // Now pretend like this activity is being started 1559 // by the top of its task, so it is put in the 1560 // right place. 1561 sourceRecord = intentActivity; 1562 } 1563 } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 1564 // In this case the top activity on the task is the 1565 // same as the one being launched, so we take that 1566 // as a request to bring the task to the foreground. 1567 // If the top activity in the task is the root 1568 // activity, deliver this new intent to it if it 1569 // desires. 1570 if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 1571 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) 1572 && intentActivity.realActivity.equals(r.realActivity)) { 1573 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 1574 intentActivity.task); 1575 if (intentActivity.frontOfTask) { 1576 intentActivity.task.setIntent(r.intent, r.info); 1577 } 1578 intentActivity.deliverNewIntentLocked(callingUid, r.intent); 1579 } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 1580 // In this case we are launching the root activity 1581 // of the task, but with a different intent. We 1582 // should start a new instance on top. 1583 addingToTask = true; 1584 sourceRecord = intentActivity; 1585 } 1586 } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 1587 // In this case an activity is being launched in to an 1588 // existing task, without resetting that task. This 1589 // is typically the situation of launching an activity 1590 // from a notification or shortcut. We want to place 1591 // the new activity on top of the current task. 1592 addingToTask = true; 1593 sourceRecord = intentActivity; 1594 } else if (!intentActivity.task.rootWasReset) { 1595 // In this case we are launching in to an existing task 1596 // that has not yet been started from its front door. 1597 // The current task has been brought to the front. 1598 // Ideally, we'd probably like to place this new task 1599 // at the bottom of its stack, but that's a little hard 1600 // to do with the current organization of the code so 1601 // for now we'll just drop it. 1602 intentActivity.task.setIntent(r.intent, r.info); 1603 } 1604 if (!addingToTask && reuseTask == null) { 1605 // We didn't do anything... but it was needed (a.k.a., client 1606 // don't use that intent!) And for paranoia, make 1607 // sure we have correctly resumed the top activity. 1608 if (doResume) { 1609 targetStack.resumeTopActivityLocked(null, options); 1610 } else { 1611 ActivityOptions.abort(options); 1612 } 1613 if (r.task == null) Slog.v(TAG, 1614 "startActivityUncheckedLocked: task left null", 1615 new RuntimeException("here").fillInStackTrace()); 1616 return ActivityManager.START_TASK_TO_FRONT; 1617 } 1618 } 1619 } 1620 } 1621 1622 //String uri = r.intent.toURI(); 1623 //Intent intent2 = new Intent(uri); 1624 //Slog.i(TAG, "Given intent: " + r.intent); 1625 //Slog.i(TAG, "URI is: " + uri); 1626 //Slog.i(TAG, "To intent: " + intent2); 1627 1628 if (r.packageName != null) { 1629 // If the activity being launched is the same as the one currently 1630 // at the top, then we need to check if it should only be launched 1631 // once. 1632 ActivityStack topStack = getFocusedStack(); 1633 ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 1634 if (top != null && r.resultTo == null) { 1635 if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 1636 if (top.app != null && top.app.thread != null) { 1637 if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 1638 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 1639 || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 1640 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 1641 top.task); 1642 // For paranoia, make sure we have correctly 1643 // resumed the top activity. 1644 topStack.mLastPausedActivity = null; 1645 if (doResume) { 1646 resumeTopActivitiesLocked(); 1647 } 1648 ActivityOptions.abort(options); 1649 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 1650 // We don't need to start a new activity, and 1651 // the client said not to do anything if that 1652 // is the case, so this is it! 1653 if (r.task == null) Slog.v(TAG, 1654 "startActivityUncheckedLocked: task left null", 1655 new RuntimeException("here").fillInStackTrace()); 1656 return ActivityManager.START_RETURN_INTENT_TO_CALLER; 1657 } 1658 top.deliverNewIntentLocked(callingUid, r.intent); 1659 if (r.task == null) Slog.v(TAG, 1660 "startActivityUncheckedLocked: task left null", 1661 new RuntimeException("here").fillInStackTrace()); 1662 return ActivityManager.START_DELIVERED_TO_TOP; 1663 } 1664 } 1665 } 1666 } 1667 1668 } else { 1669 if (r.resultTo != null) { 1670 r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 1671 r.requestCode, Activity.RESULT_CANCELED, null); 1672 } 1673 ActivityOptions.abort(options); 1674 if (r.task == null) Slog.v(TAG, 1675 "startActivityUncheckedLocked: task left null", 1676 new RuntimeException("here").fillInStackTrace()); 1677 return ActivityManager.START_CLASS_NOT_FOUND; 1678 } 1679 1680 boolean newTask = false; 1681 boolean keepCurTransition = false; 1682 1683 // Should this be considered a new task? 1684 if (r.resultTo == null && !addingToTask 1685 && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1686 targetStack = adjustStackFocus(r); 1687 moveHomeStack(targetStack.isHomeStack()); 1688 if (reuseTask == null) { 1689 r.setTask(targetStack.createTaskRecord(getNextTaskId(), 1690 newTaskInfo != null ? newTaskInfo : r.info, 1691 newTaskIntent != null ? newTaskIntent : intent, 1692 true), null, true); 1693 if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 1694 r.task); 1695 } else { 1696 r.setTask(reuseTask, reuseTask, true); 1697 } 1698 newTask = true; 1699 if (!movedHome) { 1700 if ((launchFlags & 1701 (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 1702 == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 1703 // Caller wants to appear on home activity, so before starting 1704 // their own activity we will bring home to the front. 1705 r.task.mOnTopOfHome = true; 1706 } 1707 } 1708 } else if (sourceRecord != null) { 1709 TaskRecord sourceTask = sourceRecord.task; 1710 targetStack = sourceTask.stack; 1711 moveHomeStack(targetStack.isHomeStack()); 1712 mWindowManager.moveTaskToTop(sourceTask.taskId); 1713 if (!addingToTask && 1714 (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 1715 // In this case, we are adding the activity to an existing 1716 // task, but the caller has asked to clear that task if the 1717 // activity is already running. 1718 ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 1719 keepCurTransition = true; 1720 if (top != null) { 1721 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 1722 top.deliverNewIntentLocked(callingUid, r.intent); 1723 // For paranoia, make sure we have correctly 1724 // resumed the top activity. 1725 targetStack.mLastPausedActivity = null; 1726 if (doResume) { 1727 targetStack.resumeTopActivityLocked(null); 1728 } 1729 ActivityOptions.abort(options); 1730 if (r.task == null) Slog.w(TAG, 1731 "startActivityUncheckedLocked: task left null", 1732 new RuntimeException("here").fillInStackTrace()); 1733 return ActivityManager.START_DELIVERED_TO_TOP; 1734 } 1735 } else if (!addingToTask && 1736 (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 1737 // In this case, we are launching an activity in our own task 1738 // that may already be running somewhere in the history, and 1739 // we want to shuffle it to the front of the stack if so. 1740 final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 1741 if (top != null) { 1742 final TaskRecord task = top.task; 1743 task.moveActivityToFrontLocked(top); 1744 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 1745 top.updateOptionsLocked(options); 1746 top.deliverNewIntentLocked(callingUid, r.intent); 1747 targetStack.mLastPausedActivity = null; 1748 if (doResume) { 1749 targetStack.resumeTopActivityLocked(null); 1750 } 1751 return ActivityManager.START_DELIVERED_TO_TOP; 1752 } 1753 } 1754 // An existing activity is starting this new activity, so we want 1755 // to keep the new one in the same task as the one that is starting 1756 // it. 1757 r.setTask(sourceTask, sourceRecord.thumbHolder, false); 1758 if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 1759 + " in existing task " + r.task + " from source " + sourceRecord); 1760 1761 } else { 1762 // This not being started from an existing activity, and not part 1763 // of a new task... just put it in the top task, though these days 1764 // this case should never happen. 1765 targetStack = adjustStackFocus(r); 1766 moveHomeStack(targetStack.isHomeStack()); 1767 ActivityRecord prev = targetStack.topActivity(); 1768 r.setTask(prev != null ? prev.task 1769 : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true), 1770 null, true); 1771 mWindowManager.moveTaskToTop(r.task.taskId); 1772 if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 1773 + " in new guessed " + r.task); 1774 } 1775 1776 mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 1777 intent, r.getUriPermissionsLocked()); 1778 1779 if (newTask) { 1780 EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 1781 } 1782 ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 1783 targetStack.mLastPausedActivity = null; 1784 targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 1785 mService.setFocusedActivityLocked(r); 1786 return ActivityManager.START_SUCCESS; 1787 } 1788 1789 void acquireLaunchWakelock() { 1790 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 1791 throw new IllegalStateException("Calling must be system uid"); 1792 } 1793 mLaunchingActivity.acquire(); 1794 if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 1795 // To be safe, don't allow the wake lock to be held for too long. 1796 mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 1797 } 1798 } 1799 1800 // Checked. 1801 final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 1802 Configuration config) { 1803 if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 1804 1805 ArrayList<ActivityRecord> stops = null; 1806 ArrayList<ActivityRecord> finishes = null; 1807 ArrayList<UserStartedState> startingUsers = null; 1808 int NS = 0; 1809 int NF = 0; 1810 IApplicationThread sendThumbnail = null; 1811 boolean booting = false; 1812 boolean enableScreen = false; 1813 boolean activityRemoved = false; 1814 1815 ActivityRecord r = ActivityRecord.forToken(token); 1816 if (r != null) { 1817 if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 1818 Debug.getCallers(4)); 1819 mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 1820 r.finishLaunchTickingLocked(); 1821 if (fromTimeout) { 1822 reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 1823 } 1824 1825 // This is a hack to semi-deal with a race condition 1826 // in the client where it can be constructed with a 1827 // newer configuration from when we asked it to launch. 1828 // We'll update with whatever configuration it now says 1829 // it used to launch. 1830 if (config != null) { 1831 r.configuration = config; 1832 } 1833 1834 // We are now idle. If someone is waiting for a thumbnail from 1835 // us, we can now deliver. 1836 r.idle = true; 1837 1838 if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 1839 sendThumbnail = r.app.thread; 1840 r.thumbnailNeeded = false; 1841 } 1842 1843 //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 1844 if (!mService.mBooted && isFrontStack(r.task.stack)) { 1845 mService.mBooted = true; 1846 enableScreen = true; 1847 } 1848 } 1849 1850 if (allResumedActivitiesIdle()) { 1851 if (r != null) { 1852 mService.scheduleAppGcsLocked(); 1853 } 1854 1855 if (mLaunchingActivity.isHeld()) { 1856 mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 1857 if (VALIDATE_WAKE_LOCK_CALLER && 1858 Binder.getCallingUid() != Process.myUid()) { 1859 throw new IllegalStateException("Calling must be system uid"); 1860 } 1861 mLaunchingActivity.release(); 1862 } 1863 ensureActivitiesVisibleLocked(null, 0); 1864 } 1865 1866 // Atomically retrieve all of the other things to do. 1867 stops = processStoppingActivitiesLocked(true); 1868 NS = stops != null ? stops.size() : 0; 1869 if ((NF=mFinishingActivities.size()) > 0) { 1870 finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 1871 mFinishingActivities.clear(); 1872 } 1873 1874 final ArrayList<ActivityRecord> thumbnails; 1875 final int NT = mCancelledThumbnails.size(); 1876 if (NT > 0) { 1877 thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails); 1878 mCancelledThumbnails.clear(); 1879 } else { 1880 thumbnails = null; 1881 } 1882 1883 if (isFrontStack(mHomeStack)) { 1884 booting = mService.mBooting; 1885 mService.mBooting = false; 1886 } 1887 1888 if (mStartingUsers.size() > 0) { 1889 startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 1890 mStartingUsers.clear(); 1891 } 1892 1893 // Perform the following actions from unsynchronized state. 1894 final IApplicationThread thumbnailThread = sendThumbnail; 1895 mHandler.post(new Runnable() { 1896 @Override 1897 public void run() { 1898 if (thumbnailThread != null) { 1899 try { 1900 thumbnailThread.requestThumbnail(token); 1901 } catch (Exception e) { 1902 Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 1903 mService.sendPendingThumbnail(null, token, null, null, true); 1904 } 1905 } 1906 1907 // Report back to any thumbnail receivers. 1908 for (int i = 0; i < NT; i++) { 1909 ActivityRecord r = thumbnails.get(i); 1910 mService.sendPendingThumbnail(r, null, null, null, true); 1911 } 1912 } 1913 }); 1914 1915 // Stop any activities that are scheduled to do so but have been 1916 // waiting for the next one to start. 1917 for (int i = 0; i < NS; i++) { 1918 r = stops.get(i); 1919 final ActivityStack stack = r.task.stack; 1920 if (r.finishing) { 1921 stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 1922 } else { 1923 stack.stopActivityLocked(r); 1924 } 1925 } 1926 1927 // Finish any activities that are scheduled to do so but have been 1928 // waiting for the next one to start. 1929 for (int i = 0; i < NF; i++) { 1930 r = finishes.get(i); 1931 activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle"); 1932 } 1933 1934 if (booting) { 1935 mService.finishBooting(); 1936 } else if (startingUsers != null) { 1937 for (int i = 0; i < startingUsers.size(); i++) { 1938 mService.finishUserSwitch(startingUsers.get(i)); 1939 } 1940 } 1941 1942 mService.trimApplications(); 1943 //dump(); 1944 //mWindowManager.dump(); 1945 1946 if (enableScreen) { 1947 mService.enableScreenAfterBoot(); 1948 } 1949 1950 if (activityRemoved) { 1951 resumeTopActivitiesLocked(); 1952 } 1953 1954 return r; 1955 } 1956 1957 boolean handleAppDiedLocked(ProcessRecord app) { 1958 boolean hasVisibleActivities = false; 1959 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1960 hasVisibleActivities |= mStacks.get(stackNdx).handleAppDiedLocked(app); 1961 } 1962 return hasVisibleActivities; 1963 } 1964 1965 void closeSystemDialogsLocked() { 1966 final int numStacks = mStacks.size(); 1967 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 1968 final ActivityStack stack = mStacks.get(stackNdx); 1969 stack.closeSystemDialogsLocked(); 1970 } 1971 } 1972 1973 void removeUserLocked(int userId) { 1974 mUserStackInFront.delete(userId); 1975 } 1976 1977 /** 1978 * @return true if some activity was finished (or would have finished if doit were true). 1979 */ 1980 boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 1981 boolean didSomething = false; 1982 final int numStacks = mStacks.size(); 1983 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 1984 final ActivityStack stack = mStacks.get(stackNdx); 1985 if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 1986 didSomething = true; 1987 } 1988 } 1989 return didSomething; 1990 } 1991 1992 void updatePreviousProcessLocked(ActivityRecord r) { 1993 // Now that this process has stopped, we may want to consider 1994 // it to be the previous app to try to keep around in case 1995 // the user wants to return to it. 1996 1997 // First, found out what is currently the foreground app, so that 1998 // we don't blow away the previous app if this activity is being 1999 // hosted by the process that is actually still the foreground. 2000 ProcessRecord fgApp = null; 2001 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2002 final ActivityStack stack = mStacks.get(stackNdx); 2003 if (isFrontStack(stack)) { 2004 if (stack.mResumedActivity != null) { 2005 fgApp = stack.mResumedActivity.app; 2006 } else if (stack.mPausingActivity != null) { 2007 fgApp = stack.mPausingActivity.app; 2008 } 2009 break; 2010 } 2011 } 2012 2013 // Now set this one as the previous process, only if that really 2014 // makes sense to. 2015 if (r.app != null && fgApp != null && r.app != fgApp 2016 && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 2017 && r.app != mService.mHomeProcess) { 2018 mService.mPreviousProcess = r.app; 2019 mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 2020 } 2021 } 2022 2023 boolean resumeTopActivitiesLocked() { 2024 return resumeTopActivitiesLocked(null, null, null); 2025 } 2026 2027 boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 2028 Bundle targetOptions) { 2029 if (targetStack == null) { 2030 targetStack = getFocusedStack(); 2031 } 2032 boolean result = false; 2033 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2034 final ActivityStack stack = mStacks.get(stackNdx); 2035 if (isFrontStack(stack)) { 2036 if (stack == targetStack) { 2037 result = stack.resumeTopActivityLocked(target, targetOptions); 2038 } else { 2039 stack.resumeTopActivityLocked(null); 2040 } 2041 } 2042 } 2043 return result; 2044 } 2045 2046 void finishTopRunningActivityLocked(ProcessRecord app) { 2047 final int numStacks = mStacks.size(); 2048 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2049 final ActivityStack stack = mStacks.get(stackNdx); 2050 stack.finishTopRunningActivityLocked(app); 2051 } 2052 } 2053 2054 void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) { 2055 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2056 if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) { 2057 if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" + 2058 mStacks.get(stackNdx)); 2059 return; 2060 } 2061 } 2062 } 2063 2064 ActivityStack getStack(int stackId) { 2065 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2066 final ActivityStack stack = mStacks.get(stackNdx); 2067 if (stack.getStackId() == stackId) { 2068 return stack; 2069 } 2070 } 2071 return null; 2072 } 2073 2074 ArrayList<ActivityStack> getStacks() { 2075 return new ArrayList<ActivityStack>(mStacks); 2076 } 2077 2078 int createStack() { 2079 while (true) { 2080 if (++mLastStackId <= HOME_STACK_ID) { 2081 mLastStackId = HOME_STACK_ID + 1; 2082 } 2083 if (getStack(mLastStackId) == null) { 2084 break; 2085 } 2086 } 2087 mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId)); 2088 return mLastStackId; 2089 } 2090 2091 void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2092 final TaskRecord task = anyTaskForIdLocked(taskId); 2093 if (task == null) { 2094 return; 2095 } 2096 final ActivityStack stack = getStack(stackId); 2097 if (stack == null) { 2098 Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 2099 return; 2100 } 2101 removeTask(task); 2102 stack.addTask(task, toTop); 2103 mWindowManager.addTask(taskId, stackId, toTop); 2104 resumeTopActivitiesLocked(); 2105 } 2106 2107 ActivityRecord findTaskLocked(ActivityRecord r) { 2108 if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); 2109 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2110 final ActivityStack stack = mStacks.get(stackNdx); 2111 if (!r.isApplicationActivity() && !stack.isHomeStack()) { 2112 if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack); 2113 continue; 2114 } 2115 final ActivityRecord ar = stack.findTaskLocked(r); 2116 if (ar != null) { 2117 return ar; 2118 } 2119 } 2120 if (DEBUG_TASKS) Slog.d(TAG, "No task found"); 2121 return null; 2122 } 2123 2124 ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 2125 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2126 final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info); 2127 if (ar != null) { 2128 return ar; 2129 } 2130 } 2131 return null; 2132 } 2133 2134 void goingToSleepLocked() { 2135 scheduleSleepTimeout(); 2136 if (!mGoingToSleep.isHeld()) { 2137 mGoingToSleep.acquire(); 2138 if (mLaunchingActivity.isHeld()) { 2139 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 2140 throw new IllegalStateException("Calling must be system uid"); 2141 } 2142 mLaunchingActivity.release(); 2143 mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 2144 } 2145 } 2146 checkReadyForSleepLocked(); 2147 } 2148 2149 boolean shutdownLocked(int timeout) { 2150 boolean timedout = false; 2151 goingToSleepLocked(); 2152 2153 final long endTime = System.currentTimeMillis() + timeout; 2154 while (true) { 2155 boolean cantShutdown = false; 2156 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2157 cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 2158 } 2159 if (cantShutdown) { 2160 long timeRemaining = endTime - System.currentTimeMillis(); 2161 if (timeRemaining > 0) { 2162 try { 2163 mService.wait(timeRemaining); 2164 } catch (InterruptedException e) { 2165 } 2166 } else { 2167 Slog.w(TAG, "Activity manager shutdown timed out"); 2168 timedout = true; 2169 break; 2170 } 2171 } else { 2172 break; 2173 } 2174 } 2175 2176 // Force checkReadyForSleep to complete. 2177 mSleepTimeout = true; 2178 checkReadyForSleepLocked(); 2179 2180 return timedout; 2181 } 2182 2183 void comeOutOfSleepIfNeededLocked() { 2184 removeSleepTimeouts(); 2185 if (mGoingToSleep.isHeld()) { 2186 mGoingToSleep.release(); 2187 } 2188 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2189 final ActivityStack stack = mStacks.get(stackNdx); 2190 stack.awakeFromSleepingLocked(); 2191 if (isFrontStack(stack)) { 2192 resumeTopActivitiesLocked(); 2193 } 2194 } 2195 mGoingToSleepActivities.clear(); 2196 } 2197 2198 void activitySleptLocked(ActivityRecord r) { 2199 mGoingToSleepActivities.remove(r); 2200 checkReadyForSleepLocked(); 2201 } 2202 2203 void checkReadyForSleepLocked() { 2204 if (!mService.isSleepingOrShuttingDown()) { 2205 // Do not care. 2206 return; 2207 } 2208 2209 if (!mSleepTimeout) { 2210 boolean dontSleep = false; 2211 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2212 dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 2213 } 2214 2215 if (mStoppingActivities.size() > 0) { 2216 // Still need to tell some activities to stop; can't sleep yet. 2217 if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 2218 + mStoppingActivities.size() + " activities"); 2219 scheduleIdleLocked(); 2220 dontSleep = true; 2221 } 2222 2223 if (mGoingToSleepActivities.size() > 0) { 2224 // Still need to tell some activities to sleep; can't sleep yet. 2225 if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 2226 + mGoingToSleepActivities.size() + " activities"); 2227 dontSleep = true; 2228 } 2229 2230 if (dontSleep) { 2231 return; 2232 } 2233 } 2234 2235 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2236 mStacks.get(stackNdx).goToSleep(); 2237 } 2238 2239 removeSleepTimeouts(); 2240 2241 if (mGoingToSleep.isHeld()) { 2242 mGoingToSleep.release(); 2243 } 2244 if (mService.mShuttingDown) { 2245 mService.notifyAll(); 2246 } 2247 } 2248 2249 boolean reportResumedActivityLocked(ActivityRecord r) { 2250 final ActivityStack stack = r.task.stack; 2251 if (isFrontStack(stack)) { 2252 mService.updateUsageStats(r, true); 2253 } 2254 if (allResumedActivitiesComplete()) { 2255 ensureActivitiesVisibleLocked(null, 0); 2256 mWindowManager.executeAppTransition(); 2257 return true; 2258 } 2259 return false; 2260 } 2261 2262 void handleAppCrashLocked(ProcessRecord app) { 2263 final int numStacks = mStacks.size(); 2264 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2265 final ActivityStack stack = mStacks.get(stackNdx); 2266 stack.handleAppCrashLocked(app); 2267 } 2268 } 2269 2270 void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2271 // First the front stacks. In case any are not fullscreen and are in front of home. 2272 boolean showHomeBehindStack = false; 2273 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2274 final ActivityStack stack = mStacks.get(stackNdx); 2275 if (isFrontStack(stack)) { 2276 showHomeBehindStack = 2277 stack.ensureActivitiesVisibleLocked(starting, configChanges); 2278 } 2279 } 2280 // Now do back stacks. 2281 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2282 final ActivityStack stack = mStacks.get(stackNdx); 2283 if (!isFrontStack(stack)) { 2284 stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack); 2285 } 2286 } 2287 } 2288 2289 void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 2290 final int numStacks = mStacks.size(); 2291 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2292 final ActivityStack stack = mStacks.get(stackNdx); 2293 stack.scheduleDestroyActivities(app, false, reason); 2294 } 2295 } 2296 2297 boolean switchUserLocked(int userId, UserStartedState uss) { 2298 mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); 2299 final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 2300 mCurrentUser = userId; 2301 2302 mStartingUsers.add(uss); 2303 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2304 mStacks.get(stackNdx).switchUserLocked(userId); 2305 } 2306 2307 ActivityStack stack = getStack(restoreStackId); 2308 if (stack == null) { 2309 stack = mHomeStack; 2310 } 2311 final boolean homeInFront = stack.isHomeStack(); 2312 moveHomeStack(homeInFront); 2313 mWindowManager.moveTaskToTop(stack.topTask().taskId); 2314 return homeInFront; 2315 } 2316 2317 final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 2318 int N = mStoppingActivities.size(); 2319 if (N <= 0) return null; 2320 2321 ArrayList<ActivityRecord> stops = null; 2322 2323 final boolean nowVisible = allResumedActivitiesVisible(); 2324 for (int i=0; i<N; i++) { 2325 ActivityRecord s = mStoppingActivities.get(i); 2326 if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 2327 + nowVisible + " waitingVisible=" + s.waitingVisible 2328 + " finishing=" + s.finishing); 2329 if (s.waitingVisible && nowVisible) { 2330 mWaitingVisibleActivities.remove(s); 2331 s.waitingVisible = false; 2332 if (s.finishing) { 2333 // If this activity is finishing, it is sitting on top of 2334 // everyone else but we now know it is no longer needed... 2335 // so get rid of it. Otherwise, we need to go through the 2336 // normal flow and hide it once we determine that it is 2337 // hidden by the activities in front of it. 2338 if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 2339 mWindowManager.setAppVisibility(s.appToken, false); 2340 } 2341 } 2342 if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 2343 if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 2344 if (stops == null) { 2345 stops = new ArrayList<ActivityRecord>(); 2346 } 2347 stops.add(s); 2348 mStoppingActivities.remove(i); 2349 N--; 2350 i--; 2351 } 2352 } 2353 2354 return stops; 2355 } 2356 2357 void validateTopActivitiesLocked() { 2358 for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2359 final ActivityStack stack = mStacks.get(stackNdx); 2360 final ActivityRecord r = stack.topRunningActivityLocked(null); 2361 final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 2362 if (isFrontStack(stack)) { 2363 if (r == null) { 2364 Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 2365 } else { 2366 final ActivityRecord pausing = stack.mPausingActivity; 2367 if (pausing != null && pausing == r) { 2368 Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 2369 " state=" + state); 2370 } 2371 if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 2372 Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 2373 " state=" + state); 2374 } 2375 } 2376 } else { 2377 final ActivityRecord resumed = stack.mResumedActivity; 2378 if (resumed != null && resumed == r) { 2379 Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 2380 " state=" + state); 2381 } 2382 if (r != null && (state == ActivityState.INITIALIZING 2383 || state == ActivityState.RESUMED)) { 2384 Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 2385 " state=" + state); 2386 } 2387 } 2388 } 2389 } 2390 2391 private static String stackStateToString(int stackState) { 2392 switch (stackState) { 2393 case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT"; 2394 case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK"; 2395 case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK"; 2396 case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT"; 2397 default: return "Unknown stackState=" + stackState; 2398 } 2399 } 2400 2401 public void dump(PrintWriter pw, String prefix) { 2402 pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity="); 2403 pw.println(mDismissKeyguardOnNextActivity); 2404 pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); 2405 pw.print(" mStackState="); pw.println(stackStateToString(mStackState)); 2406 pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); 2407 pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId); 2408 pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); 2409 } 2410 2411 ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 2412 return getFocusedStack().getDumpActivitiesLocked(name); 2413 } 2414 2415 static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 2416 boolean needSep, String prefix) { 2417 if (activity != null) { 2418 if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 2419 if (needSep) { 2420 pw.println(); 2421 } 2422 pw.print(prefix); 2423 pw.println(activity); 2424 return true; 2425 } 2426 } 2427 return false; 2428 } 2429 2430 boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 2431 boolean dumpClient, String dumpPackage) { 2432 boolean printed = false; 2433 boolean needSep = false; 2434 final int numStacks = mStacks.size(); 2435 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2436 final ActivityStack stack = mStacks.get(stackNdx); 2437 StringBuilder stackHeader = new StringBuilder(128); 2438 stackHeader.append(" Stack #"); 2439 stackHeader.append(mStacks.indexOf(stack)); 2440 stackHeader.append(":"); 2441 printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep, 2442 stackHeader.toString()); 2443 printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, !dumpAll, 2444 false, dumpPackage, true, " Running activities (most recent first):", null); 2445 2446 needSep = printed; 2447 boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 2448 " mPausingActivity: "); 2449 if (pr) { 2450 printed = true; 2451 needSep = false; 2452 } 2453 pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 2454 " mResumedActivity: "); 2455 if (pr) { 2456 printed = true; 2457 needSep = false; 2458 } 2459 if (dumpAll) { 2460 pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 2461 " mLastPausedActivity: "); 2462 if (pr) { 2463 printed = true; 2464 needSep = true; 2465 } 2466 printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 2467 needSep, " mLastNoHistoryActivity: "); 2468 } 2469 needSep = printed; 2470 } 2471 2472 printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 2473 false, dumpPackage, true, " Activities waiting to finish:", null); 2474 printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 2475 false, dumpPackage, true, " Activities waiting to stop:", null); 2476 printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 2477 false, dumpPackage, true, " Activities waiting for another to become visible:", 2478 null); 2479 printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 2480 false, dumpPackage, true, " Activities waiting to sleep:", null); 2481 printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 2482 false, dumpPackage, true, " Activities waiting to sleep:", null); 2483 2484 return printed; 2485 } 2486 2487 static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 2488 String prefix, String label, boolean complete, boolean brief, boolean client, 2489 String dumpPackage, boolean needNL, String header1, String header2) { 2490 TaskRecord lastTask = null; 2491 String innerPrefix = null; 2492 String[] args = null; 2493 boolean printed = false; 2494 for (int i=list.size()-1; i>=0; i--) { 2495 final ActivityRecord r = list.get(i); 2496 if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 2497 continue; 2498 } 2499 if (innerPrefix == null) { 2500 innerPrefix = prefix + " "; 2501 args = new String[0]; 2502 } 2503 printed = true; 2504 final boolean full = !brief && (complete || !r.isInHistory()); 2505 if (needNL) { 2506 pw.println(""); 2507 needNL = false; 2508 } 2509 if (header1 != null) { 2510 pw.println(header1); 2511 header1 = null; 2512 } 2513 if (header2 != null) { 2514 pw.println(header2); 2515 header2 = null; 2516 } 2517 if (lastTask != r.task) { 2518 lastTask = r.task; 2519 pw.print(prefix); 2520 pw.print(full ? "* " : " "); 2521 pw.println(lastTask); 2522 if (full) { 2523 lastTask.dump(pw, prefix + " "); 2524 } else if (complete) { 2525 // Complete + brief == give a summary. Isn't that obvious?!? 2526 if (lastTask.intent != null) { 2527 pw.print(prefix); pw.print(" "); 2528 pw.println(lastTask.intent.toInsecureStringWithClip()); 2529 } 2530 } 2531 } 2532 pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 2533 pw.print(" #"); pw.print(i); pw.print(": "); 2534 pw.println(r); 2535 if (full) { 2536 r.dump(pw, innerPrefix); 2537 } else if (complete) { 2538 // Complete + brief == give a summary. Isn't that obvious?!? 2539 pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 2540 if (r.app != null) { 2541 pw.print(innerPrefix); pw.println(r.app); 2542 } 2543 } 2544 if (client && r.app != null && r.app.thread != null) { 2545 // flush anything that is already in the PrintWriter since the thread is going 2546 // to write to the file descriptor directly 2547 pw.flush(); 2548 try { 2549 TransferPipe tp = new TransferPipe(); 2550 try { 2551 r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 2552 r.appToken, innerPrefix, args); 2553 // Short timeout, since blocking here can 2554 // deadlock with the application. 2555 tp.go(fd, 2000); 2556 } finally { 2557 tp.kill(); 2558 } 2559 } catch (IOException e) { 2560 pw.println(innerPrefix + "Failure while dumping the activity: " + e); 2561 } catch (RemoteException e) { 2562 pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 2563 } 2564 needNL = true; 2565 } 2566 } 2567 return printed; 2568 } 2569 2570 void scheduleIdleTimeoutLocked(ActivityRecord next) { 2571 if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 2572 Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 2573 mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 2574 } 2575 2576 final void scheduleIdleLocked() { 2577 mHandler.sendEmptyMessage(IDLE_NOW_MSG); 2578 } 2579 2580 void removeTimeoutsForActivityLocked(ActivityRecord r) { 2581 if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 2582 mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2583 } 2584 2585 final void scheduleResumeTopActivities() { 2586 mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 2587 } 2588 2589 void removeSleepTimeouts() { 2590 mSleepTimeout = false; 2591 mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 2592 } 2593 2594 final void scheduleSleepTimeout() { 2595 removeSleepTimeouts(); 2596 mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 2597 } 2598 2599 private final class ActivityStackSupervisorHandler extends Handler { 2600 2601 public ActivityStackSupervisorHandler(Looper looper) { 2602 super(looper); 2603 } 2604 2605 void activityIdleInternal(ActivityRecord r) { 2606 synchronized (mService) { 2607 activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 2608 } 2609 } 2610 2611 @Override 2612 public void handleMessage(Message msg) { 2613 switch (msg.what) { 2614 case IDLE_TIMEOUT_MSG: { 2615 if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 2616 if (mService.mDidDexOpt) { 2617 mService.mDidDexOpt = false; 2618 Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 2619 nmsg.obj = msg.obj; 2620 mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 2621 return; 2622 } 2623 // We don't at this point know if the activity is fullscreen, 2624 // so we need to be conservative and assume it isn't. 2625 activityIdleInternal((ActivityRecord)msg.obj); 2626 } break; 2627 case IDLE_NOW_MSG: { 2628 if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 2629 activityIdleInternal((ActivityRecord)msg.obj); 2630 } break; 2631 case RESUME_TOP_ACTIVITY_MSG: { 2632 synchronized (mService) { 2633 resumeTopActivitiesLocked(); 2634 } 2635 } break; 2636 case SLEEP_TIMEOUT_MSG: { 2637 synchronized (mService) { 2638 if (mService.isSleepingOrShuttingDown()) { 2639 Slog.w(TAG, "Sleep timeout! Sleeping now."); 2640 mSleepTimeout = true; 2641 checkReadyForSleepLocked(); 2642 } 2643 } 2644 } break; 2645 case LAUNCH_TIMEOUT_MSG: { 2646 if (mService.mDidDexOpt) { 2647 mService.mDidDexOpt = false; 2648 mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 2649 return; 2650 } 2651 synchronized (mService) { 2652 if (mLaunchingActivity.isHeld()) { 2653 Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 2654 if (VALIDATE_WAKE_LOCK_CALLER 2655 && Binder.getCallingUid() != Process.myUid()) { 2656 throw new IllegalStateException("Calling must be system uid"); 2657 } 2658 mLaunchingActivity.release(); 2659 } 2660 } 2661 } break; 2662 } 2663 } 2664 } 2665 } 2666