Жизненный цикл активности изменен с помощью 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. устройства вызывается onNewIntent MainActivity, затем сразу после этого onPause и onResume. Это означает, что активность открывается/выходит на передний план, но диалог тут же закрывается.

Возможный обходной путь — закрыть диалоговое окно в onStop(), но я не понимаю, почему это происходит на Android 7.1.1 — было ли что-то изменено в жизненном цикле?


comment
Можете ли вы опубликовать простой проект с таким поведением на github?   -  person azizbekian    schedule 06.09.2017
comment
Может ли быть так, что ваш диалог сам по себе приводит к приостановке вашей активности?   -  person Nonos    schedule 12.09.2017


Ответы (2)


Но на 7.1.1. устройства вызывается onNewIntent MainActivity, затем сразу после этого onPause и onResume. Это означает, что активность открывается/выходит на передний план, но диалог тут же закрывается.

Платформа Android может уничтожить вашу активность в любое время, когда она находится в фоновом режиме или в бэкстеке, и вы должны написать свои действия, чтобы они вели себя правильно, когда это происходит. посмотри на это :

Не оставляйте действия в меню параметров разработчика. Когда эта опция включена, ОС Android уничтожит действие, как только оно будет остановлено. Он предназначен для помощи разработчикам в отладке своих приложений. Например, он может имитировать случай, когда Android завершит работу в фоновом режиме из-за нехватки памяти. При обычном использовании не рекомендуется включать этот параметр, поскольку это может привести к непредвиденным проблемам в приложениях, таким как зависание, принудительное закрытие и перезагрузка.

Сам ваш диалог приводит к тому, что ваша деятельность приостанавливается, а затем закрывается.

person Towfik Alrazihi    schedule 13.09.2017

Вроде в версии для андроида разного нет.

Если вы включите флаг «Не сохранять активности» в настройках разработчиков, то жизненный цикл будет следующим:

onCreate
onResume
* perform startActivityForResult
onPause
onDestroy
* returning result
onCreate
onResume
onPause
onNewIntent
onResume

Потому что onNewIntent всегда находится в состоянии паузы.

person HotIceCream    schedule 11.09.2017
comment
Почему onStart() не вызывается? - person azizbekian; 13.09.2017