Activity的singleTask有什么作用

本篇内容主要讲解“Activity的singleTask有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Activity的singleTask有什么作用”吧!

这个函数无非就是根据即将要启动的SubActivity的taskAffinity属性值在系统中查找这样的一个Task:Task的affinity 属性值与即将要启动的Activity的taskAffinity属性值一致。

如果存在,就返回这个Task堆栈顶端的Activity回去。

在上面的 AndroidManifest.xml文件中,没有配置MainActivity和SubActivity的taskAffinity属性,于是它们的 taskAffinity属性值就默认为父标签application的taskAffinity属性值,这里,标签application的 taskAffinity也没有配置,于是它们就默认为包名,即"shy.luo.task"。

由于在启动SubActivity之 前,MainActivity已经启动,MainActivity启动的时候,会在一个新的任务里面启动,而这个新的任务的affinity属性就等于它 的***个Activity的taskAffinity属性值。

于是,这个函数会动回表示MainActivity的ActivityRecord回去.

回到前面的startActivityUncheckedLocked函数中,这里的taskTop就表示MainActivity,它不为 null,于是继续往前执行。由于条件r.launchMode ==  ActivityInfo.LAUNCH_SINGLE_TASK成立,于是执行下面语句:

[java] view plaincopyActivityRecord top = performClearTaskLocked( kTop.task.taskId, r, launchFlags, true);

函数performClearTaskLocked也是定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

[java] view plaincopypublic class ActivityStack {     ......     /**     * Perform clear operation as requested by     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the     * stack to the given task, then look for     * an instance of that activity in the stack and, if found, finish all     * activities on top of it and return the instance.     *     * @param newR Description of the new activity being started.     * @return Returns the old activity that should be continue to be used,     * or null if none was found.     */     private final ActivityRecord performClearTaskLocked(int taskId,     ActivityRecord newR, int launchFlags, boolean doClear) {     int i = mHistory.size();     // First find the requested task.     while (i > 0) {     i--;     ActivityRecord r = (ActivityRecord)mHistory.get(i);     if (r.task.taskId == taskId) {     i++;     break;     }     }     // Now clear it.     while (i > 0) {     i--;     ActivityRecord r = (ActivityRecord)mHistory.get(i);     if (r.finishing) {     continue;     }     if (r.task.taskId != taskId) {     return null;     }     if (r.realActivity.equals(newR.realActivity)) {     // Here it is! Now finish everything in front...     ActivityRecord ret = r;     if (doClear) {     while (i < (mHistory.size()-1)) {     i++;     r = (ActivityRecord)mHistory.get(i);     if (r.finishing) {     continue;     }     if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,     null, "clear")) {     i--;     }     }     }     // Finally, if this is a normal launch mode (that is, not     // expecting onNewIntent()), then we will finish the current     // instance of the activity so a new fresh one can be started.     if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE     && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {     if (!ret.finishing) {     int index = indexOfTokenLocked(ret);     if (index >= 0) {     finishActivityLocked(ret, index, Activity.RESULT_CANCELED,     null, "clear");     }     return null;     }     }     return ret;     }     }     return null;     }     ......     }

到此,相信大家对“Activity的singleTask有什么作用”有了更深的了解,不妨来实际操作一番吧!这里是蜗牛博客网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论电报频道链接