用inent增加tasks到overview screen
当你调用ActivityManager.AppTask 的startActivity()函数创建一个new document的时候,调用intend.addflags(FLAG_ACTIVITY_NEW_DOCUMENT),此时必须在manifest文件中设定Android:launchMode='standard'回事系统针对这个document 启动一个新的task,但是如果用FLAG_ACTIVITY_MUTIPLE_TASK的话,则系统用目标activity 作为root来new document.
用activity 属性增加task
activity 可以在manifest文件中<activity>中指定加到new task中的mode,可以通过Android:documentLaunchMode=intoExisting/always/none/never
移除tasks
默认情形下当overview screen中的activity finished的时候会被自动移除。你也可以通过intent或者<activity>来指定。可以通过在<activity>设定Android:excludeFromRecents=true 来避免被加到overview screen。
你也可以通过在<activity>中设定Android:maxRecents 来设定加到task中activity 数量。默认是16个.
当你移除task时,你可以call finishAndRemoveTask 来结束和这个task相关联的activity.
当task的所有activity finished的时候,如果想保留task 在overview screen,你可以通过intend.addflags(FLAG_ACTIVITY_RETAIN_IN_RECENTS),也可以通过设定Android:autoRemoveFromRecent=false。默认值为true,即不保留task.
/frameworks/base/core/java/android/app/ActivityManager.java
AppTask 是activityManager的一个静态子类,其采用封装模式,
2906 public AppTask(IAppTask task) {
2907 mAppTaskImpl = task;
2908 }
在其构造函数中为私有便面mAppTaskImpl 赋值。
通过mAppTaskImpl.finishAndRemoveTask 实现finishes 这个task中的activity,而且从最近的task list中移除.
2913 public void finishAndRemoveTask() {
2914 try {
2915 mAppTaskImpl.finishAndRemoveTask();
2916 } catch (RemoteException e) {
2917 Slog.e(TAG, "Invalid AppTask", e);
2918 }
2919 }
下面这三个函数都是调用mAppTaskImpl的成员函数来实现
2926 public RecentTaskInfo getTaskInfo() {
2927 try {
2928 return mAppTaskImpl.getTaskInfo();
2929 } catch (RemoteException e) {
2930 Slog.e(TAG, "Invalid AppTask", e);
2931 return null;
2932 }
2933 }
2941 public void moveToFront() {
2942 try {
2943 mAppTaskImpl.moveToFront();
2944 } catch (RemoteException e) {
2945 Slog.e(TAG, "Invalid AppTask", e);
2946 }
2947 }
2983 public void setExcludeFromRecents(boolean exclude) {
2984 try {
2985 mAppTaskImpl.setExcludeFromRecents(exclude);
2986 } catch (RemoteException e) {
2987 Slog.e(TAG, "Invalid AppTask", e);
2988 }
2989 }
2990 }
这个函数比较特殊调用thread的instruction 来执行activity.
2970 public void startActivity(Context context, Intent intent, Bundle options) {
2971 ActivityThread thread = ActivityThread.currentActivityThread();
2972 thread.getInstrumentation().execStartActivityFromAppTask(context,
2973 thread.getApplicationThread(), mAppTaskImpl, intent, options);
2974 }
public List<ActivityManager.AppTask> getAppTasks() {
1174 ArrayList<AppTask> tasks = new ArrayList<AppTask>();
1175 List<IAppTask> appTasks;
1176 try {
1177 appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
1178 } catch (RemoteException e) {
1179 // System dead, we will be dead too soon!
1180 return null;
1181 }
1182 int numAppTasks = appTasks.size();
1183 for (int i = 0; i < numAppTasks; i++) {
1184 tasks.add(new AppTask(appTasks.get(i)));
1185 }
1186 return tasks;
1187 }
其参数IAppTask = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
public List<IAppTask> getAppTasks(String callingPackage) {
8289 int callingUid = Binder.getCallingUid();
8290 long ident = Binder.clearCallingIdentity();
8291
8292 synchronized(this) {
8293 ArrayList<IAppTask> list = new ArrayList<IAppTask>();
8294 try {
8295 if (DEBUG_ALL) Slog.v(TAG, "getAppTasks");
8296
8297 final int N = mRecentTasks.size();
8298 for (int i = 0; i < N; i++) {
8299 TaskRecord tr = mRecentTasks.get(i);
8300 // Skip tasks that do not match the caller. We don't need to verify
8301 // callingPackage, because we are also limiting to callingUid and know
8302 // that will limit to the correct security sandbox.
8303 if (tr.effectiveUid != callingUid) {
8304 continue;
8305 }
8306 Intent intent = tr.getBaseIntent();
8307 if (intent == null ||
8308 !callingPackage.equals(intent.getComponent().getPackageName())) {
8309 continue;
8310 }
8311 ActivityManager.RecentTaskInfo taskInfo =
8312 createRecentTaskInfoFromTaskRecord(tr);
8313 AppTaskImpl taskImpl = new AppTaskImpl(taskInfo.persistentId, callingUid);
8314 list.add(taskImpl);
8315 }
8316 } finally {
8317 Binder.restoreCallingIdentity(ident);
8318 }
8319 return list;
8320 }
8321 }
8297 行拿到RecentTask的size 然后遍历每一个RecentTask,先拿到TaskRecord
8311 行再根据TaskRecord 拿到taskinfo。
8313 行根据taskinfo和callingUid new 一个AppTaskImpl,返回给ActivityManager.java 中的apptask 使用