使用Activity Results API來替代onActivityResult

說到onActivityResult潮针,我們已經(jīng)非常熟悉來弱贼,通過在A activity啟動(dòng)B activity并且傳入數(shù)據(jù)到B中,然后在A中通過onActivityResult來接收B中返回的數(shù)據(jù)。在最新的activity-ktx的beta版本中尸疆,谷歌已經(jīng)廢棄了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來處理頁面數(shù)據(jù)的處理超陆。通過新的 Activity Result API些膨,我們可以單獨(dú)的類中處理結(jié)果回調(diào),真正做到 單一職責(zé) 腕侄。

1.在app下的build.gradle中加入依賴:
implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
2.自定義ActivityResultContract

自定義ActivityResultContract小泉,用來處理兩個(gè)activity互傳數(shù)據(jù)的處理芦疏,替代onActivityResult方法 其中ActivityResultContract<String, String>第一個(gè)泛型參數(shù)表示輸入的參數(shù)類型,即要帶到下一個(gè)Activity的數(shù)據(jù)類型微姊, 第二個(gè)泛型參數(shù)表示輸出參數(shù)類型酸茴,即第二個(gè)Activity回傳第一個(gè)Activity的數(shù)據(jù)類型。

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.注冊ActivityResult協(xié)議

在A activity中注冊ActivityResult協(xié)議配喳,使用我們剛剛定義的CustomActivityResultContract酪穿。
registerForActivityResult方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是傳入對應(yīng)的Contract界逛,第二個(gè)參數(shù)是回調(diào)結(jié)果callback昆稿。

private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {
        //第二個(gè)頁面關(guān)閉后回到第一個(gè)頁面的回調(diào)方法
        tvName.text = it
    }
4.調(diào)用launch方法開啟界面跳轉(zhuǎn)

使用第三步我們生成的啟動(dòng)器對象的launch方法來啟動(dòng)界面跳轉(zhuǎn),launch方法需要傳入一個(gè)輸入?yún)?shù)息拜,也就是需要帶到下一個(gè)頁面的參數(shù)溉潭,可以是任意對象:

 btnStartSecond.setOnClickListener {
            //點(diǎn)擊跳轉(zhuǎn)到SecondActivity
            activityLauncher.launch("我是第一個(gè)頁面?zhèn)鬟^去的參數(shù)")
        }
5.使用谷歌內(nèi)置的 ActivityResultContract來進(jìn)行頁面跳轉(zhuǎn)

還可以通過ActivityResultContracts類來調(diào)用谷歌為我們內(nèi)置的Contract,其中包含來各種常用的Contract

  • @StartActivityForResult: 通用的Contract,不做任何轉(zhuǎn)換少欺,Intent作為輸入喳瓣,ActivityResult作為輸出,這也是最常用的一個(gè)協(xié)定赞别。
  • @RequestMultiplePermissions: 用于請求一組權(quán)限
  • @RequestPermission: 用于請求單個(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è)通過ContentResolver#openInputStream(Uri)訪問原生數(shù)據(jù)的Uri地址(content://形式) 飒焦。默認(rèn)情況下蜈膨,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的內(nèi)容。
  • @CreateDocument: 提示用戶選擇一個(gè)文檔牺荠,返回一個(gè)(file:/http:/content:)開頭的Uri翁巍。
  • @OpenMultipleDocuments: 提示用戶選擇文檔(可以選擇多個(gè)),分別返回它們的Uri休雌,以List的形式灶壶。
  • @OpenDocumentTree: 提示用戶選擇一個(gè)目錄,并返回用戶選擇的作為一個(gè)Uri返回杈曲,應(yīng)用程序可以完全管理返回目錄中的文檔例朱。
    一般情況下使用StartActivityForResult就可以滿足大部分需求啦孝情。
 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è)頁面?zhèn)鬟^去的參數(shù)")
            activityResultLauncher.launch(intent)
        }

使用系統(tǒng)內(nèi)置的ActivityResultContract可以很方便的實(shí)現(xiàn)頁面間傳值來,這樣也可以實(shí)現(xiàn)解偶操作了洒嗤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箫荡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渔隶,更是在濱河造成了極大的恐慌羔挡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件间唉,死亡現(xiàn)場離奇詭異绞灼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呈野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門低矮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人被冒,你說我怎么就攤上這事军掂。” “怎么了昨悼?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵蝗锥,是天一觀的道長。 經(jīng)常有香客問我率触,道長终议,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任葱蝗,我火速辦了婚禮穴张,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘两曼。我一直安慰自己皂甘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布合愈。 她就那樣靜靜地躺著叮贩,像睡著了一般击狮。 火紅的嫁衣襯著肌膚如雪佛析。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天彪蓬,我揣著相機(jī)與錄音寸莫,去河邊找鬼。 笑死档冬,一個(gè)胖子當(dāng)著我的面吹牛膘茎,可吹牛的內(nèi)容都是我干的桃纯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼披坏,長吁一口氣:“原來是場噩夢啊……” “哼态坦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棒拂,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伞梯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帚屉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜诫,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年攻旦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喻旷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牢屋,死狀恐怖且预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伟阔,我是刑警寧澤辣之,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皱炉,受9級特大地震影響怀估,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜合搅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一多搀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灾部,春花似錦康铭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锁蠕,卻和暖如春夷野,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荣倾。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工悯搔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舌仍。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓妒貌,卻偏偏與公主長得像通危,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子灌曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355