activity和fragment中startactivityforresult方法的區別

閃電無憂發表於2020-10-20

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是正常我們傳入的值。

相關文章