Когда мы запускаем Android-приложения из History (Недавние приложения), приложение может запускаться в основном с тремя различными флагами Intent.
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
Это когда активность запускается изистория приложения, которое было свернуто (долгое нажатие на клавишу возврата домой).
Постоянное значение: 1048576 (0x00100000) FLAG_ACTIVITY_NEW_TASK
Это когда действие запускается через "щелкнув значок приложения "или через" Фильтры намерений".Здесь действие станет началом новой задачи в этом стеке истории.
Постоянное значение: 268435456 (0x10000000) FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
Это когда приложение было закрытопутем нажатия кнопки «Назад» и затем возобновления из «Журнала» (последние приложения).
Постоянное значение: 269484032 (0x10100000)
Постоянное значение можно получить с помощью getIntent().getFlags()
В третьем случае Android перезагружает последние значения Intent из своей памяти.Таким образом, у намерения вашего приложения (getIntent
) будут значения из последнего намерения, которое запустило приложение.
На самом деле, приложение должно вести себя так, как будто это новый запуск, со значениями намерений для нового запуска, а незначения намерений предыдущего запуска. Такое поведение можно увидеть, если вы запустите приложение, щелкнув значок приложения, оно никогда не будет иметь старых значений намерений.Это связано с тем, что Android использует следующий фильтр намерений для этого сценария
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
Но в третьем случае (приложение, которое было закрыто, запускается из Истории последних приложений), ОС Android использует это последнеенамерение, которое запустило приложение до того, как оно было закрыто (нажатием кнопки назад).Таким образом, в конечном итоге вы получаете старые значения намерений, а поток приложения не является правильным.
Удаление намерения - это один из способов его решения, но это не решит проблему полностью!Поскольку ОС Android перезагружает Намерение из последнего запуска приложений, а не последний экземпляр намерения запуска.
Чистый способ избежать этого - обработать его путем получения типа Намерение для определения типа запуска.
Таким образом, в вашей LaunchActivity (той, в которой фильтр намерений определен в манифесте) вы можете использовать следующий код в onCreate()
, onStart()
или onResume()
методов.
if(getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) {
//app is launched from recent apps after it was closed
normalLaunch();
} else {
String intentAction = getIntent().getAction();
String scheme = getIntent().getScheme();
//app is launched via other means
// URL intent scheme, Intent action etc
if("https".equalsIgnoreCase(scheme)) {
// URL intent for browser
} else if("com.example.bb".equalsIgnoreCase(intentAction)) {
// App launched via package name
} else {
// App was launched via Click on App Icon, or other means
normalLaunch();
}
}
Полагаю, normalLaunch()
, не следует использовать параметры из намерения;в противном случае вам потребуется разделить и оптимизировать метод запуска по умолчанию, чтобы не использовать параметры Intent.