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

這個網誌中的熱門文章

【從零開始學 Java 程式設計】 進階佈局管理器 - GridBagLayout

16天記下7000單字

nano 文字編輯器

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

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