activity和fragment中startactivityforresult方法的区别

activity的startacitivityforresult方法这里不做分析,有兴趣的可以自己看源码。

fragment中的startactivityforresult方法

 会调用其成员变量mHost的onStartActivityFromFragment方法。

 这个mHost其实是FragmentActivity中的内部类HostCallbacks的实现对象,有兴趣的同学可以去看FragmentMangerImpl和FragmentController的源码。

通过调用mHost的onStartActivityFromFragment方法,最终调用的是FragmentActivity中的startActivityFromFragment方法。

 

 可以看到在这个方法中会把requestCode做一次左移16的操作,同事调用activity的startActivityForResult方法。

其他的不用分析,直接看onActivityResult方法

在这个方法中,会先把requestCode右移16位, 然后判断右移之后的值是否等于0.前面已经了解到,fragment的requestCode因为系统给做了左移操作,所以在右移之后,值肯定是不等于0的。而且activity中的startactivityfroresult方法,会有requestCode的检查

 也就是说,activity中传入的requestCode太大的话,会直接抛出异常。

所以onActivityResult方法中的if语句,只有调用Fragment中的startActivityForResult方法才会走进来,看里面的实现逻辑,可以知道会调用Fragment的onActivityResult方法。但是Activity的startActivityForResult方法不会通知Fragment调用onActivityResult方法,需要我们自己去通知Fragment.

另,调用Fragment中的startActivityForResult方法,activity中的onActivityResult方法得到的requestCode是左移之后的值(大于等于65535),而此时Fragment中的onActivityResult方法得到的requestCode是正常我们传入的值。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页