###前提
リリース済みのアプリでKotlinでApplicationを継承したクラスを作成し、パッケージレベルのオブジェクトにそのクラスのインスタンスを保存しています。
Kotlin
1class App:Application() { 2 init { 3 context = this 4 } 5} 6var context: Context? = null
このcontextをSharedPreferencesやresources.displayMetrics.densityを参照する用に使いまわしています。
Android7未満では問題なく動作していたのですが、
Android7端末でのみクラッシュログから以下のSharedPreferencesにアクセスする際にcontextがnullになっていることがわかりました。
Kotlin
1context!!.getSharedPreferences("hoge", Context.MODE_PRIVATE)
エミュレータや手元のAndroid7実機では再現しておらず、またクラッシュログも特定メーカー・端末に偏らず発生しています。
上記SharedPreferencesへのアクセスは、android.intent.category.LAUNCHERに指定されたActivityのonCreate()で行っています。
###試したこと
contextの保存タイミングが悪いのかと思い、以下のようにinitではなくonCreate()に移動しましたが、
現象変わらずのようで、クラッシュログが発生していました。
Kotlin
1class App:Application() { 2 override fun onCreate() { 3 context = this 4 } 5} 6var context: Context? = null
###実現したいこと
Android7系でも6以前と同じようにApplicationクラスのインスタンスを保存し、画面のないクラスでのcontextに使いまわしたいです。
もしこういう使い回し自体がよろしくないのであれば、非画面のクラスでContextを使う場合のベスト・プラクティスが知りたいです。
###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio 2.3.2
Kotlin 1.1.2
SDK version 25
あなたの回答
tips
プレビュー