(1)发起startActivityForResult调用
 
这种情况会直接调用到Fragment的startActivityForResult方法
//Fragment.class
 public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
 if (mHost == null) {
 throw new IllegalStateException(“Fragment " + this + " not attached to Activity”);
 }
 mHost.onStartActivityFromFragment(this /fragment/, intent, requestCode, options);
 }
上面的mHost对应的就是Fragment的父FragmentActivity,所以会调用到父FragmentActivity的startActivityFromFragment方法
//FragmentActivity.class
 public void startActivityFromFragment(Fragment fragment, Intent intent,
 int requestCode, @Nullable Bundle options) {
 mStartedActivityFromFragment = true;
 try {
 //一般requestCode都不会为-1,所以不会走if里面
 if (requestCode == -1) {
 ActivityCompat.startActivityForResult(this, intent, -1, options);
 return;
 }
 //这里检查requestCode是否越界了,不能超过2^16
 checkForValidRequestCode(requestCode);
 //根据这个requestIndex可以获取到对应Fragment的唯一标识mWho
 int requestIndex = allocateRequestIndex(fragment);
 //发起startActivityForResult调用,这里requestIndex和requestCode关联起来
 ActivityCompat.startActivityForResult(
 this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
 } finally {
 mStartedActivityFromFragment = false;
 }
 }
每一个Fragment在内部都有一个唯一的标识字段who,在FragmentActivity中把所有调用startActivityFromFragment方法的fragment的requestCode和who通过key-value的方式保存在mPendingFragmentActivityResults变量中
private int allocateRequestIndex(Fragment fragment) {
 …
int requestIndex = mNextCandidateRequestIndex;
//将requestIndex和fragment的mWho保存起来
 mPendingFragmentActivityResults.put(requestIndex, fragment.mWho);
 mNextCandidateRequestIndex =
 (mNextCandidateRequestIndex + 1) % MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS;
return requestIndex;
 }
这里allocateRequestIndex方法就把requestIndex和Fragment的mWho变量关联起来了
在上面的startActivityFromFragment方法中调用ActivityCompat的startActivityForResult方法发起启动Activity的时候又把requestIndex和requestCode关联起来了
这样后面回调onActivityResult方法时就可以根据requestCode获取对应的Fragment,以便调用Fragment的onActivityResult方法
最后看一下ActivityCompat的startActivityForResult方法
public static void startActivityForResult(@NonNull Activity activity, @NonNull Intent intent,
 int requestCode, @Nullable Bundle options) {
 if (Build.VERSION.SDK_INT >= 16) {
 activity.startActivityForResult(intent, requestCode, options);
 } else {
 activity.startActivityForResult(intent, requestCode);
 }
 }
(2)onActivityResult方法回调
 
通过断点调试的方法,我们会发现最先被回调的就是父Activity的onActivityResult,也就是我们的FragmentActivity的onActivityResult
@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 mFragments.noteStateNotSaved();
 int requestIndex = requestCode>>16;
 //requestIndex = 0就表示没有Fragment发起过startActivityForResult调用
 if (requestIndex != 0) {
 requestIndex–;
//根据requestIndex获取Fragment的who变量
 String who = mPendingFragmentActivityResults.get(requestIndex);
 mPendingFragmentActivityResults.remove(requestIndex);
 if (who == null) {
 Log.w(TAG, “Activity result delivered for unknown Fragment.”);
 return;
 }
//然后根据who变量获取目标Fragment
 Fragment targetFragment = mFragments.findFragmentByWho(who);
 if (targetFragment == null) {
 Log.w(TAG, "Activity result no fragment exists for who: " + who);
 } else {
 //最后调用Fragment的onActivityResult
 targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
 }
 return;
 }
…
文末
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
这里笔者分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。


【视频教程】

天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。
3880723596)]
【视频教程】
[外链图片转存中…(img-KvuRyWYH-1643880723596)]
天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。










