アプリ終了時にデータが消えないように端末に保存する方法です
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