Android Activity Results API代替onActivityResult處理頁(yè)面數(shù)據(jù)
onActivityResult
@SuppressWarnings("deprecation") @Override @CallSuper protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { mFragments.noteStateNotSaved(); super.onActivityResult(requestCode, resultCode, data); }
Activity Results API的使用
在最新beta版本中谷歌推薦使用Activity Results API來(lái)處理頁(yè)面數(shù)據(jù)的處理。通過(guò)新的 Activity Result API,我們可以單獨(dú)的類(lèi)中處理結(jié)果回調(diào),真正做到 單一職責(zé) 。
1.在app下的build.gradle中加入依賴(lài):
implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
2.自定義ActivityResultContract
自定義ActivityResultContract,用來(lái)處理兩個(gè)activity互傳數(shù)據(jù)的處理,替代onActivityResult方法 其中ActivityResultContract<String, String>第一個(gè)泛型參數(shù)表示輸入的參數(shù)類(lèi)型,即要帶到下一個(gè)Activity的數(shù)據(jù)類(lèi)型, 第二個(gè)泛型參數(shù)表示輸出參數(shù)類(lèi)型,即第二個(gè)Activity回傳第一個(gè)Activity的數(shù)據(jù)類(lèi)型。
class CustomActivityResultContract : ActivityResultContract<String, String>() { override fun createIntent(context: Context, input: String?): Intent { //要傳到下一個(gè)activity中的數(shù)據(jù),從A activity中帶到B activity中的數(shù)據(jù)。 return Intent(context, SecondActivity::class.java).putExtra("name", input) } override fun parseResult(resultCode: Int, intent: Intent?): String { //從activity回傳的數(shù)據(jù) val result = intent?.getStringExtra("result") //從B activity中回傳的數(shù)據(jù)。 if (resultCode == Activity.RESULT_OK && result != null) { return "$result" } return "" } }
3.注冊(cè)ActivityResult協(xié)議
在A activity中注冊(cè)ActivityResult協(xié)議,使用我們剛剛定義的CustomActivityResultContract。
registerForActivityResult方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是傳入對(duì)應(yīng)的Contract,第二個(gè)參數(shù)是回調(diào)結(jié)果callback。
private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) { //第二個(gè)頁(yè)面關(guān)閉后回到第一個(gè)頁(yè)面的回調(diào)方法 tvName.text = it }
4.調(diào)用launch方法開(kāi)啟界面跳轉(zhuǎn)
使用第三步我們生成的啟動(dòng)器對(duì)象的launch方法來(lái)啟動(dòng)界面跳轉(zhuǎn),launch方法需要傳入一個(gè)輸入?yún)?shù),也就是需要帶到下一個(gè)頁(yè)面的參數(shù),可以是任意對(duì)象:
btnStartSecond.setOnClickListener { //點(diǎn)擊跳轉(zhuǎn)到SecondActivity activityLauncher.launch("我是第一個(gè)頁(yè)面?zhèn)鬟^(guò)去的參數(shù)") }
5.使用谷歌內(nèi)置的 ActivityResultContract來(lái)進(jìn)行頁(yè)面跳轉(zhuǎn)
還可以通過(guò)ActivityResultContracts類(lèi)來(lái)調(diào)用谷歌為我們內(nèi)置的Contract,其中包含來(lái)各種常用的Contract
- @StartActivityForResult: 通用的Contract,不做任何轉(zhuǎn)換,Intent作為輸入,ActivityResult作為輸出,這也是最常用的一個(gè)協(xié)定。
- @RequestMultiplePermissions: 用于請(qǐng)求一組權(quán)限
- @RequestPermission: 用于請(qǐng)求單個(gè)權(quán)限
- @TakePicturePreview: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值為Bitmap圖片
- @TakePicture: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,并將圖片保存到給定的Uri地址,返回true表示保存成功。
- @TakeVideo: 調(diào)用MediaStore.ACTION_VIDEO_CAPTURE 拍攝視頻,保存到給定的Uri地址,返回一張縮略圖。
- @PickContact: 從通訊錄APP獲取聯(lián)系人
- @GetContent: 提示用選擇一條內(nèi)容,返回一個(gè)通過(guò)ContentResolver#openInputStream(Uri)訪問(wèn)原生數(shù)據(jù)的Uri地址(content://形式) 。默認(rèn)情況下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的內(nèi)容。
- @CreateDocument: 提示用戶(hù)選擇一個(gè)文檔,返回一個(gè)(file:/http:/content:)開(kāi)頭的Uri。
- @OpenMultipleDocuments: 提示用戶(hù)選擇文檔(可以選擇多個(gè)),分別返回它們的Uri,以List的形式。
- @OpenDocumentTree: 提示用戶(hù)選擇一個(gè)目錄,并返回用戶(hù)選擇的作為一個(gè)Uri返回,應(yīng)用程序可以完全管理返回目錄中的文檔。
一般情況下使用StartActivityForResult就可以滿(mǎn)足大部分需求啦。
private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK) { val result = intent?.getStringExtra("result") tvName.text = result } } btnStartSecond.setOnClickListener { //點(diǎn)擊跳轉(zhuǎn)到SecondActivity val intent = Intent(this, SecondActivity::class.java) intent.putExtra("name", "我是第一個(gè)頁(yè)面?zhèn)鬟^(guò)去的參數(shù)") activityResultLauncher.launch(intent) }
使用系統(tǒng)內(nèi)置的ActivityResultContract可以很方便的實(shí)現(xiàn)頁(yè)面間傳值來(lái),這樣也可以實(shí)現(xiàn)解偶操作了。
到此這篇關(guān)于Android Activity Results API代替onActivityResult處理頁(yè)面數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Android Activity Results API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android計(jì)步功能的實(shí)現(xiàn)代碼
本篇文章主要介紹了Android計(jì)步功能的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03解析Android獲取系統(tǒng)cpu信息,內(nèi)存,版本,電量等信息的方法詳解
本篇文章對(duì)用Android獲取系統(tǒng)cpu信息,內(nèi)存,版本,電量等信息的方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05Android RecyclerView布局就這么簡(jiǎn)單
Android RecyclerView布局就這么簡(jiǎn)單!RecyclerView比ListView更靈活,更強(qiáng)大,作為一個(gè)android開(kāi)發(fā)者如果還不知道如何使用android5.X的RecyclerView未免有點(diǎn)說(shuō)不過(guò)去了,本文就為大家講解Android RecyclerView布局,需要的朋友可以參考下2016-04-04Android 解決監(jiān)聽(tīng)home鍵的幾種方法
這篇文章主要介紹了Android 解決監(jiān)聽(tīng)home鍵的幾種方法的相關(guān)資料,需要的朋友可以參考下2017-02-02Android EditText設(shè)置邊框的操作方法
這篇文章主要介紹了Android EditText設(shè)置邊框,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12Handler實(shí)現(xiàn)倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Handler實(shí)現(xiàn)倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04