Иногда я замечал, что значение одноэлементных объектов устанавливается в NULL, когда я вывожу приложение из фона на передний план, и я считаю, что это как-то связано с моими настройками режима запуска.
<application
android:name="FooApplication"
android:allowBackup="false">
<activity
android:name="SplashActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="MainActivity"
android:launchMode="singleTop" />
</application>
Это поток Splash -> Main. Вот как я запускаю основную активность из SplashActivity.
val nextIntent = Intent(context, MainActivity::class.java);
nextIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)
finish()
Я использую Koin для внедрения некоторого одноэлементного объекта из класса приложения.
class ProductManager() {
internal var productsMap: MutableMap<String, String> = ConcurrentSkipListMap(String.CASE_INSENSITIVE_ORDER)
//This is being populated by some method call from SplashActivity
}
Теперь в 90% случаев я могу видеть, что значение существует, когда я перевожу приложение с фона на передний план, пока я нахожусь в MainActivity. Однако иногда ProductManager.productsMap имеет значение NULL, хотя сам ProductManager не равен NULL.
Я предполагаю, что MainActivity убит процессом, а данные потеряны. Если данные потеряны, почему объект ProductManager, внедряемый в MainActivity, не равен NULL, но его свойство равно NULL. Этого не должно было случиться, так как Activity убит, но процесс все еще существует, поскольку когда я запускаю, он все еще переходит к MainActivity, являющейся текущей вершиной, не перезапуская приложение снова.
Я не хочу хранить данные из Bundle или SharedPreference. Могу ли я перезапустить приложение, которое будет автоматически загружать данные вместо получения значения NULL из Singleton.
Splash > MainActivity
, попробуйте удалитьnextIntent.addFlags()
и добавитьfinish()
послеstartActivity()
. Это предпочтительный поток. - person DarShan   schedule 21.07.2019singleTask
режим запуска. Это создает больше проблем, чем решает. - person David Wasser   schedule 22.07.2019