rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android 画面回転でのActivityのデータ、LiveDataの扱われ方

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()
            }
        }
    }
}