понимание того, почему действия Android создаются в этом сценарии

У меня есть метод quit, который делает это:

public void quitFinalize(ServicedActivity actCtx)
{   
    for (ServicedActivity act : mRunningActivities)
        launchActivity(actCtx, new Intent(mAppCtx, act.getClass()).setAction("--"));
}

Проверено, что mRunningActivities в порядке. Он состоит из всех действий в моей задаче, которые были созданы, а не уничтожены. Все действия наследуются от:

public class ServicedActivity extends FragmentActivity implements OnClickListener
{
    ...

    @Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);

        if (/*Intent.ACTION_SCREEN_OFF*/"--".equals(intent.getAction()))            // used for quitting the game
        {
            finish();
        }
    }

        ...
}

Я заметил, что для 2 действий в наборе механизм работает нормально. Однако для трех действий Android 4.0.3 решает, что он должен запустить (создать) еще один экземпляр одного из действий в наборе (похоже, ему особенно нравится запускать одно определенное действие, а не любое). и они заканчивают их все (таким образом, 4 уничтоженных действия вместо исходных 3)

Я уверен, что это не я создал эту активность непреднамеренно - вся моя логика launchActivity фильтруется с помощью метода, который добавляет флаг FLAG_ACTIVITY_REORDER_TO_FRONT к Intent, поэтому я не могу получить два экземпляра одного и того же класса Activity. Это должна быть ОС, которая создает его заново.

Также пробовал без свойства файла манифеста android:launchMode="singleTop" - это похоже на все действия в приложении. То же самое.

Что здесь происходит ? вышеприведенный метод onNewIntent() срабатывает 3 раза, как и ожидалось, но в середине Android создает новую активность, а затем сразу же завершает ее.

Спасибо



person kellogs    schedule 03.09.2012    source источник
comment
возможно, связано: stackoverflow.com/questions/11703256 /   -  person kellogs    schedule 22.09.2012


Ответы (1)


Кажется, мне удалось решить проблему по ошибке: в документах упоминается, что действия должны быть уничтожены/воссозданы при различных событиях, таких как изменения конфигурации. Поэтому я подумал о том, чтобы украсть контроль над всеми возможными изменениями конфигурации из ОС; теперь AndroidManifest.xml выглядит так

<activity android:name=".ui.MainMenu" android:launchMode="singleTop" android:screenOrientation="reverseLandscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
   android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|fontScale"   />

... etc, same for all activities

Теперь документы также заявить, что:

public void onConfigurationChanged (Конфигурация newConfig) С: API уровня 1

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

Я переопределил этот метод в своей деятельности, и он вообще редко вызывается (например, 1 из 20 раз). Но проблема исчезла, и этот метод действительно не вызывается. Так что я немного запутался. Может быть, это не было причиной моей проблемы, но... как-то связано.

person kellogs    schedule 05.09.2012