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