2014-11-27 3 views
0

launchMode является «SingleTop»:Как бороться с несколькими экземплярами Android?

<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» launchMethod.

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

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

ответ

0

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

Android "single top" launch mode and onNewIntent method

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

EDIT:

Вы должны быть осторожны, чтобы читать на «launchMode» - SingleTop и «стандартные» режимы имеют такое поведение, из документации:

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

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

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

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

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

+0

MainActivity не разрушен, он вызывает StartActivity() в GridActivity и остается в живых. Он будет уничтожен только тогда, когда вы выйдете из приложения, нажав кнопку «Назад». Если это была проблема, тогда было бы неважно, открываю ли я приложение из ящика приложения или из «рабочего стола», но, как вы можете прочитать выше, это происходит только тогда, когда я открываю приложение из одного места, а затем открываю его снова из другого (первый раз из ящика приложения и второй раз с «рабочего стола» или наоборот) –

+0

Я отредактировал свой ответ. Надеюсь, поможет. – Jim

+0

Вы не знаете, как мне решить эту проблему? Создание GridActivity в качестве первого действия, а затем отображение MainActibity (SplashScreen) должно решить его? –

Смежные вопросы