overview screen

overview screen 是系统级别的UI,用于列表显示最近访问的activity 和 task.用户可以挑选一个task重新运行,就像快速按两下iphone的home 键.一般情况下你应该允许系统来定义你的task 和activity 是如何呈现在overview screen上的。但是你也可以通过ActivityManager.AppTask 的intent 来管理tasks 和activity的flag来决定何时将activity 来增加或者移除over screen,也可以通过manifest文件中的<activity>属性来做.
用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 使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值