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是正常我們傳入的值。
相關文章
- Activity和Fragment有什麼區別Fragment
- Fragment中呼叫startActivityForResult的那些坑Fragment
- Activity、Fragment和IntentFragmentIntent
- 將一個Activity中的資料傳到另一個Activity的Fragment中的方法Fragment
- Activity和fragment是如何互動的Fragment
- Android筆記之Fragment的startActivityForResult(與requestPermissions)Android筆記Fragment
- savedInstanceState和 fragment.setRetainInstance以及 viewmodel的區別FragmentAIView
- fragment返回鍵關閉fragment以及最後一個fragment的時候關閉activity的簡便方法Fragment
- Fragment傳值到ActivityFragment
- Java中 equals() 方法和 == 的區別Java
- laravel中delete()方法和destroy()方法的區別Laraveldelete
- Android--單Activity+多Fragment,玩轉FragmentAndroidFragment
- jQuery中css()和attr()方法的區別jQueryCSS
- Python中函式和方法的區別Python函式
- Android | Activity和Fragment最全生命週期+發現大牛AndroidFragment
- Android之android:theme設定在Application 和 Activity的區別AndroidAPP
- 介面和列舉在方法中的區別
- Activity 中的方法 findViewById(int) 和 AppCompatActivity 中的方法 findViewById(int) 都匹配...ViewAPP
- ==和equals方法的區別
- 安卓APP活動Activity的生命週期及其各方法,注意onPause()和onStop()的區別安卓APP
- jquery中append、prepend, before和after方法的區別jQueryAPP
- http請求中get和post方法的區別HTTP
- 優雅地封裝 Activity Result API,完美地替代 startActivityForResult()封裝API
- sendRedirect()和forward()方法的區別Forward
- ## 運算子和方法的區別
- Python3中列表方法append()和extend()的區別PythonAPP
- 3-AVI–Activity與Fragment的資料傳遞Fragment
- js中call,apply和bind方法的區別和使用場景JSAPP
- Flutter Android 端 Activity/Fragment 流程原始碼分析FlutterAndroidFragment原始碼
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- mysql中!=和is not的區別MySql
- Python中is和==的區別Python
- JavaScript中==和===的區別JavaScript
- Linux中“>”和“>>”的區別Linux
- Python 中 is 和 == 的區別Python
- mysql中“ ‘ “和 “ ` “的區別MySql
- 方法重置和重寫的區別