[Android] 012. データの保存(Bundle / Local Storage)

アプリ終了時にデータが消えないように端末に保存する方法です
DB(Room)は別途確認です

Bundleに保存

SharedPreferences

Key-Valueに書込むのでアプリ終了後もデータは保存されている
ただし保存できるのはInt/Long/Boolean/Float/String/StringSetのみ

以下も参照
https://developer.android.com/training/data-storage/shared-preferences?hl=ja

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

        setContent {
            val sharedPref = LocalContext.current.getSharedPreferences("app", Context.MODE_PRIVATE)
            // 保存
            sharedPref.edit().putInt("count", 1).commit()
            // 取得
            val count = sharedPref.getInt("count", 0)
            ...
        }
    }
}

Parcelable

アプリ終了までの保存
実際に使うかどうかは置いておいてonSaveInstanceState / onRestoreInstanceStateを使う場合

以下も参照
https://developer.android.com/kotlin/parcelize?hl=ja

使用する前の設定

plugins {
    id 'kotlin-parcelize'
}

@Parcelize data class Datas(var name: String = ""): Parcelable
inline fun <reified T> Bundle.parcelable(key: String): T? = when {
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getParcelable(key, T::class.java)
    else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}

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

        //TODO: アプリ起動時はsavedInstanceState = null なので注意
        val datas: Datas = savedInstanceState?.let { it.parcelable<Datas>("app") } ?: Datas()
        ...
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)

        val datas = Datas("test")
        outState.putParcelable("app", datas)
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)

        val datas: Datas = savedInstanceState.parcelable<Datas>("app") ?: Datas("none")
    }
}

ローカルストレージにファイルで保存

Android 11(API30)からローカルストレージの扱いが変わってるので注意
https://developer.android.com/about/versions/11/privacy/storage?hl=ja


Android 13ではローカルストレージのdata/user/0/(project)/filesに保存されます
AndroidManifestにpermission(ファイルのアクセス権限)の指定は不要

保存されたかの確認はAndroid StudioのDevice File Explorer でできますが、実行毎に読み込み直さないと反映されないのでちょっと不便

val fileName = "test.txt"
val text = "test"
// 追記
context.openFileOutput(fileName, Context.MODE_PRIVATE or Context.MODE_APPEND).use { stream ->
    stream.write(text.toByteArray())
}

Android Studio Dolphin 2021.3.1 Patch 1 built on September 30, 2022