startActivityForResult is deprecated 已廢棄替代解決方式

HKT 講師,相關課程

HKT 講師,相關課程:
🎬 從零開始學 SwiftUI 程式設計 免費講義
https://bit.ly/3xCbUUp
🎬 從零開始學 Swift 程式設計 免費講義
https://bit.ly/3ekjsEP
🎬Android 入門開發實戰:口罩地圖(Kotlin) 免費講義
https://bit.ly/2KKZcju
🎬從零開始學 Dart 程式設計 免費講義
https://bit.ly/2OJW6hl
🎬 Flutter 程式設計入門實戰 免費講義
https://bit.ly/37L47Ij
🎬從零開始學 Java 程式設計 免費講義
https://bit.ly/2WlCn6y
🎬 從零開始學 kotlin 程式設計 免費講義
https://bit.ly/2Kx7GrM

startActivityForResult is deprecated

這題意外滿多人私訊詢問 ,KT 就來說明一下,在過往我們要從A頁跳到B頁,並從B頁返回時帶回相關資料。之前我們都是使用 startActivityForResult 跳頁和 onActivityResult 解析返回時有無攜帶資料,但這套方法目前已被官方宣布廢棄。所以你可以看到目前使用的話會被用白線劃掉。

滑鼠游標移過去可以看到提示說明: startActivityForResult is deprecated 這個意思就是官方將此方法宣布廢棄。目前只是提示,仍可以繼續使用,但在未來新版本釋出就有可能就變成是紅字完全被移除無法使用。所以看到類似提示,建議可以提早解決改成新的替代方案。

舊的使用方式(已廢棄)

附上,舊的使用方式,留著未來考古用,或是目前維護的專案程式是前輩寫的,可以知道有這麼一件事,過去的使用方式。

const val REQUEST_CODE_1 = 1
const val MY_DATA = "MY_DATA"
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnNext.setOnClickListener {
            val intent = Intent(this, BActivity::class.java)
            //已廢棄
            startActivityForResult(intent, REQUEST_CODE_1)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            //已廢棄
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            REQUEST_CODE_1 -> if (data != null) {
                Log.d("HKT", "MY_DATA:" + data.getStringExtra(MY_DATA))
            }
        }
    }
}

補充資料:本篇文章有使用到「View Binding」,不熟悉同學可以參考 KT 寫的這一篇文章:元件綁定 View Binding

新的替代解決方式

首先註冊一個 callBack 回來要處理的 API,registerForActivityResult(),就是取代以前的 onActivityResult()的用法。

var resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val myData: Intent? = result.data
            if (myData != null) {
                Log.d("HKT", "MY_DATA:" + myData.getStringExtra(MY_DATA))
            }
        }
    }

然後要開起 Activity,就是透過我們剛剛註冊 resultLauncher 來開啟另一個 Activity,就是取代以前的 startActivityForResult()的用法。

val intent = Intent(this, BActivity::class.java)
resultLauncher.launch(intent)

程式碼範例

範例名稱:registerForActivityResult 範例
開發人員:HKT (侯光燦)
程式語言:Kotlin
開發環境:Android Studio Arctic Fox 2020.3.1 & Android 11 & Kotlin 1.5.31
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載

更多詳細說明,可以參考官方文件:
Getting a result from an activity

贊助我們

創作不易,知識無價,免費線上教學就像顆種子,希望藉由您的支持與贊助,能夠無後顧之憂的日漸茁壯,努力前行堅持下去。不論捐贈金額的大小,我們都由衷的感謝每位贊助者,都是我們推廣知識、開放共享知識最大的動力!

您的捐贈將用於:請作者喝杯咖啡,鼓勵繼續創作,持續上傳教學影片與更多新技術文章。

Line Pay 打賞


(由 Line Pay 支付平台,提供轉帳服務)

街口打賞


(由街口行動支付平台,提供轉帳服務)

超商代碼繳費打賞

(由綠界科技支付平台,提供超商繳費代碼)

相關連結

HKT 線上教室 每週六日 更新影片
▶ YouTube 頻道
https://goo.gl/3f2pJi
▶ KT 線上教室 臉書粉絲團
https://goo.gl/27H9Li
▶ Udemy 頻道
http://bit.ly/2ZNdnrt
▶ 贊助我們
https://goo.gl/FiKXAu

AndroidStudio / Xcode
Java / Kotlin / Dart / Flutter
APP / AppDevloper
Android / AndroidDevloper
iOS / iOSDeveloper / Swift / SwiftUI
Programer

這個網誌中的熱門文章

16天記下7000單字

nano 文字編輯器

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

最新入門零基礎 Java 教學【從零開始學 Java 程式設計】Java教學課程目錄 (IntelliJ IDEA 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)