Как бороться с несколькими экземплярами Android?

Режим запуска — «singleTop»:

<activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".GridActivity"></activity>

MainActivity — это экран-заставка, когда он завершится (аутентифицируется на сервере), он вызовет GridActivity.

Проблема очень конкретная:

Когда вы устанавливаете приложение из Google Play, значок появляется в двух местах: в панели приложений и на «Рабочем столе» (экран запуска — панель запуска по умолчанию).

Действия по воспроизведению проблемы:

  1. Откройте приложение из панели приложений и дождитесь отображения GridActivity.
  2. Нажмите кнопку «Домой», чтобы отправить приложение в фоновый режим.
  3. Откройте приложение с «Рабочего стола» (средство запуска устройства по умолчанию).
  4. Приложение запустится в новом экземпляре

Я ожидаю, что приложение перейдет непосредственно к GridActivity из-за метода запуска "singleTop".

Кстати, если на шаге 3 я снова открываю приложение из ящика приложений, оно работает нормально, переходит непосредственно к GridActivity.

Что мне не хватает?


person Gadi Paz    schedule 27.11.2014    source источник


Ответы (1)


Поскольку вы используете свою активность запуска в качестве «экрана-заставки», она, вероятно, уничтожается, что приводит к такому поведению. Как только он будет уничтожен, другой процесс, вызвавший его, запустит его в новом процессе. Прочтите это, чтобы узнать больше:

Режим запуска Android с одной вершиной и метод onNewIntent

Режим запуска "singleTop" скорее всего не нужен. Хотя, чтобы обойти это, я использую флаг «в первый раз», который запускает заставку из основного действия. Кажется, это работает очень хорошо.

РЕДАКТИРОВАТЬ:

Вы должны быть осторожны, чтобы прочитать "launchMode" - режимы singleTop и "standard" имеют такое поведение из документов:

Активность с режимом запуска «стандартный» или «singleTop» может создаваться несколько раз.

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

Вероятно, вы сталкиваетесь с этим аспектом singleTop:

например, если существующий экземпляр действия "singleTop" находится в целевой задаче, но не на вершине стека, или если он находится на вершине стека, но не в целевой задаче, будет создан новый экземпляр. создается и помещается в стек.

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

person Jim    schedule 27.11.2014
comment
MainActivity не уничтожается, он вызывает StartActivity() для GridActivity и остается в живых. Он будет уничтожен только тогда, когда вы выйдете из приложения, нажав кнопку «Назад». Если бы это было проблемой, то не имело бы значения, открываю ли я приложение из панели приложений или с рабочего стола, но, как вы можете прочитать выше, это происходит только тогда, когда я открываю приложение из одного места, а затем снова открываю его из другого ( первый раз из панели приложений и второй раз с рабочего стола или наоборот) - person Gadi Paz; 27.11.2014
comment
У вас есть идеи, как мне решить эту проблему? Создание GridActivity в качестве первого действия, а затем отображение MainActibity (SplashScreen) должно решить эту проблему? - person Gadi Paz; 30.11.2014