Android应用程序组件Activity的"singleTask"(8)

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

这个函数无非就是根据即将要启动的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); 
  • 1.
  • 2.

函数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
      } 
      ...... 
      } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.

 

责任编辑:闫佳明 来源: bbs.9ria
相关推荐

2014-05-27 15:09:13

AndroidActivitysingleTask

2014-05-27 14:59:24

AndroidActivitysingleTask

2014-05-27 14:33:37

AndroidActivitysingleTask

2014-05-27 14:16:08

AndroidActivitysingleTask

2014-05-27 15:07:07

AndroidActivitysingleTask

2014-05-27 15:11:20

AndroidActivitysingleTask

2014-05-27 15:17:46

AndroidActivitysingleTask

2014-05-27 14:09:52

AndroidActivitysingleTask

2014-05-27 14:44:26

AndroidActivitysingleTask

2014-05-27 14:28:25

AndroidActivitysingleTask

2014-05-27 14:12:49

AndroidActivitysingleTask

2010-02-06 15:26:11

Android应用程序

2009-08-14 17:08:00

Android应用程序

2013-01-17 15:51:42

Android开发应用程序组件

2010-12-13 11:40:17

Android应用程序

2012-12-25 09:52:22

Windows 8

2010-11-11 14:38:37

2012-04-25 22:56:10

Android

2022-09-27 15:16:42

开发Android应用程序

2010-03-03 16:45:46

Android应用程序
点赞
收藏

51CTO技术栈公众号