Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?_第1张图片

典型回答

使用场景

  • 用户开始新的活动,并且希望得到新活动的某些信息。比如选择照片、选择联系人、选择收货地址、进行某块数据编辑工作等。

requestCode

  • 解决的是「区分多个异步任务」的问题。与其他异步 API 的设计类似,如果没有这个信息,那么 Activity 在收到响应时会进入混乱的状态。比如他不知道自己得到的是选择照片还是选择联系人的结果。

  • 该信息会发送到 AMS 那边的 ActivityRecord.requestCode 变量进行记录,Client 端新 Activity 并不知道这个信息。

  • 为什么 requestCode < 0 时收不到结果?

  • ActivityStarter 收到 startActivityLocked 时,写入 ActivityRecord.resultTo 变量为空

                if (requestCode >= 0 && !sourceRecord.finishing) {
                    // 只有非负数时新的 ActivityRecord 对象的 resultTo 变量才指向发起者 ActivityRecord 对象
                    resultRecord = sourceRecord;
                }
  • 在 ActivityStack 收到 finishActivityResultsLocked 时,读取 ActivityRecord.resultTo 变量为空,结果数据不会添加到源 ActivityRecord.results 变量

  • 在 ActivityStack 收到 resumeTopActivityInnerLocked 时,读取 ActivityRecord.results 数组为空,不会分发结果数据,这样源 Activity 也就没有结果回调了

resultCode

  • 异步调用结果码,告诉调用者成功/失败/其它信息

  • 该信息由被调用 Activity / framework 写入,并经过 AMS 传递给源 Activity。

你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

你可能感兴趣的:(Android,--,每日一问,android,每日一问)