ActivityStack.java revision a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4
150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/* 250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License. 650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at 750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and 1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License. 1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am; 1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity; 2050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl; 2150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity; 2450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals; 2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager; 2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_CLASS_NOT_FOUND; 2750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_DELIVERED_TO_TOP; 2850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_INTENT_NOT_RESOLVED; 3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_PERMISSION_DENIED; 3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_RETURN_INTENT_TO_CALLER; 3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SUCCESS; 3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SWITCHES_CANCELED; 3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_TASK_TO_FRONT; 3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread; 3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent; 3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo; 3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult; 3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName; 4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context; 4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender; 4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent; 4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender; 4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo; 4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo; 4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager; 4750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo; 4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration; 4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri; 5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 5150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Bundle; 5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpublic class ActivityStack { 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // 30 minutes. 10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 1000*60*30; 10450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 10650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 10750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mHistory = new ArrayList(); 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mLRUActivities = new ArrayList(); 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + token); 24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityPaused(token, null, true); 24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + token); 26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, true, null); 26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + token); 26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityDestroyed(token); 27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 27250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 27350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, false, null); 27450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 27550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 27650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 27750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 27850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 27950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 28050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 28150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 28550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 28650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 29250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 29750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 29850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 29950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 32650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && (token != r) && (taskId != r.task.taskId)) { 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int count = mHistory.size(); 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // convert the token to an entry in the history. 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = -1; 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=count-1; i>=0; i--) { 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Object o = mHistory.get(i); 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (o == token) { 36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn index = i; 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return index; 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.mayFreezeScreenLocked(app) ? r : null); 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, r); 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r, 50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info, r.icicle, results, newIntents, !andResume, 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if ((app.info.flags&ApplicationInfo.CANT_SAVE_STATE) != 0) { 50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.haveState = false; 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 57450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 57550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 57650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 57850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 57950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 58050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 58850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 58950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.startTime == 0) { 59050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startTime = SystemClock.uptimeMillis(); 59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = r.startTime; 59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 59550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void pauseIfSleepingLocked() { 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mSleeping || mService.mShuttingDown) { 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not currently pausing an activity, get the current 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one to pause. If we are pausing one, we will just let that stuff 62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // run and release the wake lock when all done. 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause..."); 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.configChangeFlags); 66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityPaused(IBinder token, Bundle icicle, boolean timeout) { 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Activity paused: token=" + token + ", icicle=" + icicle 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", timeout=" + timeout); 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(index); 72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!timeout) { 73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = icicle; 73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.haveState = true; 73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 75250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 75750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 75850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(prev, true); 77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 78850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 79150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 79250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mGoingToSleep.isHeld()) { 79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.release(); 79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mShuttingDown) { 79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 80250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 81550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 82750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 82850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 84250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 84350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 84750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 84950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.thumbnail = null; 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 92050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, true); 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, false); 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 107650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE); 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN); 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(next, true); 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next : null); 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updated = mService.updateConfigurationLocked(config, next); 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleSendResult(next, a); 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next); 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleResumeActivity(next, 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.labelRes, next.icon, null, true); 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null, 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.labelRes, next.icon, null, true); 130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doResume) { 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = null; 131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = p; 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = mHistory.size(); 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN); 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); 139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos, r, r.task.taskId, r.info.screenOrientation, r.fullscreen); 139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r, r.packageName, r.theme, r.nonLocalizedLabel, 142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.labelRes, r.icon, prev, showStartingIcon); 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 145450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord below = i >= 0 ? (ActivityRecord)mHistory.get(i) : null; 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 147250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 149750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(0); 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task = p.task; 152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task = new TaskRecord(mService.mCurTask, target.info, null, 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(target, task.taskId); 154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities--; 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = target.task; 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.numActivities++; 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p); 156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(target.task); 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ((ActivityRecord)mHistory.get( 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 161350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (target.resultTo != null) { 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(srcPos); 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task.numActivities--; 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = task; 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities++; 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p); 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(j); 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the old activity that should be continue to be used, 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newR, int launchFlags, boolean doClear) { 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doClear) { 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i < (mHistory.size()-1)) { 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear")) { 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(ret); 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord candidate = (ActivityRecord)mHistory.get(i); 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newTop = (ActivityRecord)mHistory.remove(where); 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord oldTop = (ActivityRecord)mHistory.get(top-1); 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean componentSpecified) { 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Starting activity: " + intent); 184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Sending result to " + resultTo + " (index " + index + ")"); 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = (ActivityRecord)mHistory.get(index); 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int err = START_SUCCESS; 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (intent.getComponent() == null) { 188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = null; 189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && caller != null) { 189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callerApp.pid; 190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = callerApp.info.uid; 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_PERMISSION_DENIED; 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid, aInfo.exported ? -1 : aInfo.applicationInfo.uid); 192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String msg = "Permission Denial: starting " + intent.toString() 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", uid=" + callingUid + ")" 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " requires " + aInfo.permission; 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return startActivityUncheckedLocked(r, sourceRecord, 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (curTop.task != taskTop.task) { 210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.taskId, r, launchFlags, true); 213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 214339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 216839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask) { 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 225650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // todo: should do better management of integers. 225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = new TaskRecord(mService.mCurTask, r.info, intent, 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new task " + r.task); 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(r.task); 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.task.taskId, r, launchFlags, true); 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 228139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 229839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = sourceRecord.task; 230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N > 0 ? (ActivityRecord)mHistory.get(N-1) : null; 231950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = prev != null 232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? prev.task 232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent, 232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 232739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 232839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 232939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 23307e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 233139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 233239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 233339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 233439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 23357e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 233639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startActivityLocked(r, newTask, doResume); 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, IBinder resultTo, 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean debug, WaitResult outResult, Configuration config) { 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Refuse possible leaked file descriptors 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't modify the client's object! 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = new Intent(intent); 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingUid; 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller == null) { 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 240702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.CANT_SAVE_STATE) != 0) { 240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 240950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid, null, null, 0, intent, 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType, PendingIntent.FLAG_CANCEL_CURRENT 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded, componentSpecified); 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, null); 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn wait(); 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn wait(); 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 25607e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleSendResult(r, list); 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags); 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(s, false); 264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!s.waitingVisible && remove) { 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityIdleInternal(IBinder token, boolean fromTimeout, 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (token != null) { 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, token); 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mBooted && !fromTimeout) { 272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Finishing activity: token=" + token 281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this the last activity left? 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean lastActivity = true; 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!p.finishing && p != r) { 282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastActivity = false; 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the last activity, but it is the home activity, then 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just don't finish it. 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastActivity) { 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.finishing = true; 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities--; 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = (ActivityRecord)mHistory.get(index+1); 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // send the result 288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultTo = r.resultTo; 288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 2888a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.packageName, resultData, 2889a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.getUriPermissionsLocked()); 289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultData); 289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because clients have remote IPC references to this object so we 289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || ((ActivityRecord)mHistory.get(index-1)).task != r.task; 291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE); 292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int index = indexOfTokenLocked(r); 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return destroyActivityLocked(r, true) ? null : r; 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices) { 301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void removeActivityFromHistoryLocked(ActivityRecord r) { 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = false; 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.removeAppToken(r); 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removeFromApp) { 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityLocked(r, false); 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.persistent) { 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.decPersistentCountLocked(r.app); 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(r.app, true, false); 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleDestroyActivity(r, r.finishing, 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token); 317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top < 0 || ((ActivityRecord)mHistory.get(top)).task.taskId == task) { 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean first = true; 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(0, r); 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (first && mMainStack) { 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(r.task); 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn first = false; 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT); 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(r); 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_BACK); 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configuration == newConfig) { 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't persistent, there is a chance we will 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // need to restart it. 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.persistent) { 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out what has changed between the two configurations. 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes = oldConfig.diff(newConfig); 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + Integer.toHexString(r.info.configChanges) 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", newConfig=" + newConfig); 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((changes&(~r.info.configChanges)) != 0) { 343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags |= changes; 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is destroying non-running " + r); 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A little annoying: we are waiting for this activity to 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish pausing. Let's not do anything now, but just 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // flag that it needs to be restarted when done pausing. 344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is skipping already pausing " + r); 344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = true; 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Try to optimize this case: the configuration is changing 344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and we need to restart the top, resumed activity. 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Instead of doing the normal handshaking, just say 344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "restart!". 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is restarting resumed " + r); 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is restarting non-resumed " + r); 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // All done... tell the caller we weren't able to keep this 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity around. 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r); 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r, results, newIntents, 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn changes, !andResume, mService.mConfiguration); 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 3524