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

移动开发 Android
首先是获得用来启动Activity的Intent的Flags,并且保存在launchFlags变量中。这里,launcFlags的Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位没有置位。

首先是获得用来启动Activity的Intent的Flags,并且保存在launchFlags变量中。

这里,launcFlags的Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位没有置位。

因此,notTop为null。

接下来的这个if语句:

  1. [java] view plaincopy if (sourceRecord == null) { 
  2. ...... 
  3. else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) 
  4.  
  5. ...... 
  6. else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 
  7. || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 
  8. // The activity being started is a single instance... it always 
  9. // gets launched into its own task. 
  10. launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 

这里变量r的类型为ActivityRecord,它表示即将在启动的Activity,在这个例子中,即为SubActivity,因此,这里的 r.launchMode等于ActivityInfo.LAUNCH_SINGLE_TASK,于是,无条件将launchFlags的 Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP位置为1,表示这个SubActivity要在新的任务中启动,但是别急,还 要看看其它条件是否满足,如果条件都满足,才可以在新的任务中启动这个SubActivity。

接下将addingToTask变量初始化为false,这个变量也将决定是否要将SubActivity在新的任务中启动,从名字我们就可以看出, 默认不增加到原有的任务中启动,即要在新的任务中启动。这里的r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK条成立,条件r.resultTo == null也成立,它表这个Activity不需要将结果返回给启动它的Activity。于是会进入接下来的if语句中,执行:

 

  1. [java] view plaincopy ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 
  2.  
  3. ? findTaskLocked(intent, r.info) 
  4.  
  5. : findActivityLocked(intent, r.info) 

 

这里的条件r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE成立,于是执行findTaskLocked函数,这个函数也是定义在 frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

  1. [java] view plaincopypublic class ActivityStack { 
  2.       ...... 
  3.       /** 
  4.       * Returns the top activity in any existing task matching the given 
  5.       * Intent. Returns null if no such task is found. 
  6.       */ 
  7.       private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) 
  8.     { 
  9.       ComponentName cls = intent.getComponent(); 
  10.       if (info.targetActivity != null) { 
  11.       cls = new ComponentName(info.packageName, info.targetActivity); 
  12.       } 
  13.       TaskRecord cp = null
  14.       final int N = mHistory.size(); 
  15.       for (int i=(N-1); i>=0; i--) { 
  16.       ActivityRecord r = (ActivityRecord)mHistory.get(i); 
  17.       if (!r.finishing && r.task != cp 
  18.       && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 
  19.       cp = r.task; 
  20.       //Slog.i(TAG, "Comparing existing cls=" + 
  21.     r.task.intent.getComponent().flattenToShortString() 
  22.       // + "/aff=" + r.task.affinity + " to new cls=" 
  23.       // + intent.getComponent().flattenToShortString() + "/aff=" + 
  24.     taskAffinity); 
  25.       if (r.task.affinity != null) { 
  26.       if (r.task.affinity.equals(info.taskAffinity)) { 
  27.       //Slog.i(TAG, "Found matching affinity!"); 
  28.       return r; 
  29.       } 
  30.       } else if (r.task.intent != null 
  31.       && r.task.intent.getComponent().equals(cls)) { 
  32.       //Slog.i(TAG, "Found matching class!"); 
  33.       //dump(); 
  34.       //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + 
  35.     r.intent); 
  36.       return r; 
  37.       } else if (r.task.affinityIntent != null 
  38.       && r.task.affinityIntent.getComponent().equals(cls)) { 
  39.       //Slog.i(TAG, "Found matching class!"); 
  40.       //dump(); 
  41.       //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + 
  42.     r.intent); 
  43.       return r; 
  44.       } 
  45.       } 
  46.       } 
  47.       return null
  48.       } 
  49.       ...... 
  50.       } 

 

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

2014-05-27 14:33:37

AndroidActivitysingleTask

2014-05-27 15:04:15

AndroidActivitysingleTask

2014-05-27 15:09:13

AndroidActivitysingleTask

2014-05-27 14:16:08

AndroidActivitysingleTask

2014-05-27 14:28:25

AndroidActivitysingleTask

2014-05-27 14:44:26

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:12:49

AndroidActivitysingleTask

2014-05-27 14:09:52

AndroidActivitysingleTask

2009-08-14 17:08:00

Android应用程序

2010-02-06 15:26:11

Android应用程序

2013-01-17 15:51:42

Android开发应用程序组件

2010-11-11 14:38:37

2022-09-27 15:16:42

开发Android应用程序

2012-04-25 22:56:10

Android

2011-05-24 16:09:57

Androi

2010-03-03 16:45:46

Android应用程序

2010-01-25 13:29:53

Android本地应用
点赞
收藏

51CTO技术栈公众号