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

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

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、网站设计、思礼网络推广、小程序制作、思礼网络营销、思礼企业策划、思礼品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供思礼建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

这里,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. } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
  6. || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
  7. // The activity being started is a single instance... it always
  8. // gets launched into its own task.
  9. launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
  10. }

这里变量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. ? findTaskLocked(intent, r.info)
  3. : 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.       }

网页标题:Android应用程序组件Activity的"singleTask"(7)
地址分享:http://www.mswzjz.cn/qtweb/news37/397737.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能