質問編集履歴
2
onSaveInstanceState()について追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -98,6 +98,22 @@
|
|
98
98
|
|
99
99
|
|
100
100
|
|
101
|
+
https://stackoverflow.com/questions/44256250/does-viewmodel-survive-activity-save-and-restore
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
> the ViewModel is destroyed if your process is killed by Android.
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
システムによってキルされた場合、ViewModelさんも死んでしまうみたいですね。
|
110
|
+
|
111
|
+
しかし、できれば `onSaveInstanceState()` を使いたくないのですよねぇ。
|
112
|
+
|
113
|
+
ProviderをいじるなどのViewModelの管理方法をいじる程度で対処できればいいのですが、それが無理なのであれば、諦めますけど。
|
114
|
+
|
115
|
+
|
116
|
+
|
101
117
|
### コード・出力結果
|
102
118
|
|
103
119
|
|
1
コードの全体の掲載
test
CHANGED
File without changes
|
test
CHANGED
@@ -104,9 +104,111 @@
|
|
104
104
|
|
105
105
|
```Kotlin
|
106
106
|
|
107
|
+
package sakana.tadano.androidsampleapp.views
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
import android.app.Activity
|
112
|
+
|
113
|
+
import android.content.Intent
|
114
|
+
|
115
|
+
import android.os.Bundle
|
116
|
+
|
117
|
+
import android.view.MenuItem
|
118
|
+
|
119
|
+
import androidx.appcompat.app.AppCompatActivity
|
120
|
+
|
121
|
+
import androidx.core.view.GravityCompat
|
122
|
+
|
123
|
+
import androidx.lifecycle.Observer
|
124
|
+
|
125
|
+
import androidx.lifecycle.ViewModelProvider
|
126
|
+
|
127
|
+
import androidx.lifecycle.ViewModelProviders
|
128
|
+
|
129
|
+
import kotlinx.android.synthetic.main.activity_main.*
|
130
|
+
|
131
|
+
import sakana.tadano.androidsampleapp.R
|
132
|
+
|
133
|
+
import sakana.tadano.androidsampleapp.viewmodels.Activity1ViewModel
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
class Activity1 : AppCompatActivity() {
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
init {
|
142
|
+
|
143
|
+
println("Activity1::init")
|
144
|
+
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
|
107
|
-
val viewModel by lazy {
|
149
|
+
val viewModel by lazy {
|
108
|
-
|
150
|
+
|
109
|
-
ViewModelProviders.of(this@Activity1).get(Activity1ViewModel::class.java)
|
151
|
+
ViewModelProviders.of(this@Activity1, ViewModelProvider.AndroidViewModelFactory(this.application)).get(Activity1ViewModel::class.java)
|
152
|
+
|
153
|
+
}
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
158
|
+
|
159
|
+
super.onCreate(savedInstanceState)
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
// xmlとコードを紐付ける。
|
164
|
+
|
165
|
+
this.setContentView(R.layout.activity_main)
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
// ボタンを押すと画面遷移をする。
|
170
|
+
|
171
|
+
this.floatingActionButton.setOnClickListener { this.startActivity2() }
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
println("Activity1.onCreate() | Activity1: ${this.hashCode()}, Activity1ViewModel: ${this.viewModel.hashCode()}")
|
176
|
+
|
177
|
+
}
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
override fun onDestroy() {
|
182
|
+
|
183
|
+
println("Activity1.onDestroy()")
|
184
|
+
|
185
|
+
super.onDestroy()
|
186
|
+
|
187
|
+
}
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
// Activity2を開始する。
|
192
|
+
|
193
|
+
private fun startActivity2() {
|
194
|
+
|
195
|
+
val intent = Intent(this, Activity2::class.java).also {
|
196
|
+
|
197
|
+
it.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
|
198
|
+
|
199
|
+
it.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
|
200
|
+
|
201
|
+
it.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
202
|
+
|
203
|
+
it.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
204
|
+
|
205
|
+
it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
206
|
+
|
207
|
+
}
|
208
|
+
|
209
|
+
this.startActivity(intent)
|
210
|
+
|
211
|
+
}
|
110
212
|
|
111
213
|
}
|
112
214
|
|
@@ -114,24 +216,6 @@
|
|
114
216
|
|
115
217
|
|
116
218
|
|
117
|
-
```Kotlin
|
118
|
-
|
119
|
-
override fun onCreate() {
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
// その他の処理
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
println("Activity1.onCreate() | Activity1: ${this.hashCode()}, Activity1ViewModel: ${this.viewModel.hashCode()}")
|
128
|
-
|
129
|
-
}
|
130
|
-
|
131
|
-
```
|
132
|
-
|
133
|
-
|
134
|
-
|
135
219
|
```
|
136
220
|
|
137
221
|
// 1. "Don't keep activities" が無効なとき:
|