Жизненный цикл активности изменен с помощью API 25 (7.1.1)
В моей MainActivity у меня есть диалог, который открывается, если установлен флаг в намерении. Если диалог был создан, он отклоняется в onPause()
@Override
public void onPause() {
super.onPause();
if (_dialog!= null) {
_dialog.dismiss();
_dialog= null;
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intentContainsFlag) {
_dialog = ....;
_dialog.show();
}
}
Диалоговое окно должно быть открыто, если нажата кнопка владельца списка ListView и создается URI намерения:
bttn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// The URL scheme is registered in the intent filter
String intentString = "http://open.example.com/myParameters";
v.getContext().startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse(intentString)));
}
});
AndroidManigfest содержит:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http" android:host="open.example.com" android:pathPattern=".*"/>
<data android:scheme="https" android:host="open.example.com" android:pathPattern=".*"/>
</intent-filter>
....
В версиях sdk установлено значение
minSdkVersion = 19
targetSdkVersion= 22
compileSdkVersion = 23
buildToolsVersion = 23
В Android < 7.1.1, все работает так, как ожидалось: onNewIntent()
вызывается и диалог виден.
Но на 7.1.1. Устройства
вызывается MainActivity onNewIntent
, затем непосредственно после onPause
и onResume
. Это означает, что активность открывается сама/выходит на передний план, но диалог был немедленно закрыт.
Возможным обходным путем является закрытие диалога в onStop()
, но я не понимаю, почему это происходит на Android 7.1.1 - что-то изменилось в жизненном цикле?
Ответы
Ответ 1
Но на 7.1.1. вызывается MainActivity onNewIntent, затем непосредственно после этого на Pause и onResume. Это означает, что активность открывается сама/выходит на передний план, но диалог был немедленно закрыт.
Фреймворк Android может уничтожать вашу активность в любое время в фоновом режиме или в фоновом режиме, и вы должны писать свои действия, чтобы они правильно работали, когда это происходит. посмотрите на это:
Не выполняйте действия в меню "Параметры разработчика". Когда это опция включена, ОС Android уничтожит действие, как только он остановлен. Он призван помочь разработчикам отладить свои приложения. Для Например, он может имитировать случай, когда Android убьет действие в фоновом режиме из-за давления памяти. При нормальном использовании это не рекомендуется включить этот параметр, поскольку это может привести к неожиданным проблемы в приложениях, такие как зависания, принудительное закрытие и перезагрузка.
В самом диалоговом окне ваша операция приостанавливается и закрывается.
Ответ 2
Похоже, что в версии для Android нет различий.
Если вы установите флажок "Не сохранять действия" в настройках разработчиков, тогда жизненный цикл будет следующим:
onCreate
onResume
* perform startActivityForResult
onPause
onDestroy
* returning result
onCreate
onResume
onPause
onNewIntent
onResume
Потому что onNewIntent
всегда находится в состоянии паузы.