SharedPreferenceのxmlファイルができるタイミング
Androidで設定画面を作ってみるでAndroidX Preference Libraryを使って設定画面のサンプルを作りました。業務でHTTPで通信するようなアプリを開発していて、HTTPの送信先のURLをAndroidX Preference Libraryを使って作りました。
ここで、気がついたのですが、
SharedPreferenceのxmlファイルはインストールした直後はできていない。設定画面(PreferenceFragmentCompatのFragment)が呼ばれたタイミングで作られます。(もしくは、SharedPreferenceに初めて、putXxxxしたタイミング。ま、言われてみれば当たり前と言えば当たり前)
標準では、ここにできているはずです。
/data/data/{パッケージ名}/shared_prefs/{パッケージ名}_preferences.xml
ここで問題になったのが、インストール直後、1回でも設定画面を開いてくれれば問題ないのですが、1度も開かずに送信しようとすると、送信先のURLがSharedPreferenceにないので、送信先が取得できず、送れないということです。
送信先のURLはAndroidX Preference Libraryの画面定義のxmlにデフォルト値として定義されているので、設定画面を1度開けば、何も変更しなくても、xmlファイルに書き込まれます。
似たような作りのアプリであれあ同じ問題が起こるかもしれません。
この事象の対応として
- アプリの起動時、もしくは送信前にSharedPreferenceに送信先のURLが無ければ、設定画面に誘導する。
- 何らかの方法で、インストール時にSharedPreferenceのxmlを作る。
上記の1.は実現可能ですが、設定値はほぼデフォルトのままで変更する必要がなく(テスト時とか、よほどのことが無い限り変更がない)、なのにユーザを設定画面に誘導するのは無駄のような気がする。
2.は送信先URLがAndroidX Preference Libraryの画面定義のxmlにデフォルト値と別々に二重定義になってしまう可能性があり、イマイチ。
解決策
PreferenceManagerのsetDefaultValuesを使うことにより、AndroidX Preference Libraryの画面定義のxmlからDefault値を撮ってきて、xmlファイルに書き出します。
これは、MainActivityのonCreateに入れておきます。
override fun onCreate(savedInstanceState: Bundle?) {
・・・
PreferenceManager.setDefaultValues(applicationContext, R.xml.root_preferences, false)
・・・
}
第3引数はfalseにしておくと、このメソッドがまだ一度も呼ばれていない場合だけ、default値が作られます。(毎回、上書きされることはない)
これで、無駄に設定画面に誘導することもなく、送信先URLを二重定義することもなく済みました。