2022 Oct. 11.
2022 Oct. 10.
画面回転すると、OnDestroyイベントが発生し、Activityが破棄され、その後、Activityが再生成され、onCreateイベントが発生する。
画面回転後のデータの値
Activityデータは破棄される
onCreateイベント時に初期化されるActivityデータは初期値となる。
Viewの値がプロパティで設定されていれば、その値となる。
onCreateイベント後に変更されたActivityデータは破棄される。
ViewModelのLiveDataは最新の値が保持される
ActivityでObserveされているViewModelのLiveDataはActivityの再作成時に最新の値がActivity側に反映される。
参考ページ LiveData の概要 | Android デベロッパー | Android Developers
検証コード
MainActivity
import android.os.Bundle import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { private val myViewModel: MyViewModel by viewModels() private var localInt = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textViewInfo01 = findViewById<TextView>(R.id.textView01) val textViewInfo02 = findViewById<TextView>(R.id.textView02) val textViewInfo03 = findViewById<TextView>(R.id.textView03) val myStringObserver = Observer<String> { textViewInfo01.text = it } val myStringObserver2 = Observer<String> { textViewInfo03.text = it } myViewModel.myString.observe(this, myStringObserver) myViewModel.myString2.observe(this, myStringObserver2) myViewModel.waitAaddXtimes() lifecycleScope.launch { for ( i in 1..50) { delay(5000L) textViewInfo02.text = (++localInt).toString() } } } }
MyViewModel
import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch class MyViewModel: ViewModel(){ private var localInt = 0 private var localStr = "MyViewModelStr" private val _myString = MutableLiveData<String>("") val myString: LiveData<String> get() = _myString private val _myString2 = MutableLiveData<String>(localStr) val myString2: LiveData<String> get() = _myString2 fun waitAaddXtimes() { _myString.value = localInt.toString() viewModelScope.launch { for ( i in 1..50) { delay(5000L) _myString.value = (++localInt).toString() } } } }