Переменная одноэлементных объектов случайным образом устанавливается в NULL

Иногда я замечал, что значение одноэлементных объектов устанавливается в 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.


person Bulu    schedule 21.07.2019    source источник
comment
Если ваш поток Splash > MainActivity, попробуйте удалить nextIntent.addFlags() и добавить finish() после startActivity(). Это предпочтительный поток.   -  person DarShan    schedule 21.07.2019
comment
@DarShan, у меня уже есть финиш, который я обновил сейчас. Позвольте мне попробовать удалить флаг.   -  person Bulu    schedule 22.07.2019
comment
Вам не нужен singleTask режим запуска. Это создает больше проблем, чем решает.   -  person David Wasser    schedule 22.07.2019


Ответы (1)


Ваш процесс уничтожается, пока приложение находится в фоновом режиме. Android создает новый процесс, когда пользователь возвращается в приложение, и создает экземпляр только Activity в верхней части стека (вероятно, это будет MainActivity), что означает, что все, что настроено в SplashActivity, будет null.

Вам нужно будет либо хранить свои данные где-то еще (постоянно), либо вам нужно будет обнаружить, что Android убил процесс, и повторно инициализировать ваши данные в памяти, когда вы обнаружите это.

Я ответил на многие вопросы о том, как это сделать. Проверьте это:

https://stackoverflow.com/a/29802601/769265

https://stackoverflow.com/a/27276077/769265

https://stackoverflow.com/a/11249090/769265

person David Wasser    schedule 22.07.2019