2014-12-29 2 views
0

В моем приложении у меня есть три вида деятельности:Избегайте активности возобновления, когда приложение проходит в фоновом режиме

<activity 
     android:name="com.example.myapp.SplashScreenActivity" 
     android:exported="true" 
     android:launchMode="singleInstance" 
     android:noHistory="true" 
     android:screenOrientation="sensorLandscape" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.myapp.MainActivity" 
     android:exported="false" 
     android:launchMode="singleInstance" 
     android:screenOrientation="sensorLandscape" > 
    </activity> 
    <activity 
     android:name="com.example.myapp.ListActivity" 
     android:exported="false" 
     android:launchMode="singleTop" 
     android:screenOrientation="sensorLandscape" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.myapp.MainActivity" /> 
    </activity> 

Первых из них связаны с LAUNCHER, SplashScreenActivity, который является заставкой, которая исчезнет довольно скоро, и это не показано в последнее время начинается, MainActivity. В MainActivity пользователи могут выбрать категорию, а ListActivity отображает предметы, принадлежащие данной категории. Это делается с помощью следующего кода:

Intent i = new Intent(getActivity(),ListActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
i.putExtra("category",mCategory); 
startActivity(i); 

В ListActivity в onResume метод проверяет «категории» дополнительные и приведены данные соответственно. Начиная с Activity launchMode является singleTop, я также переопределил метод onNewIntent, чтобы установить новый Intent из Activity.

Это работает должным образом, если приложение не идет в фоновом режиме: в этом случае, когда я перезапустить MainActivity и выберите категорию, ListActivity возобновляет старые Activity показывающих данных, относящихся к ранее выбранной категории.

Как исправить флаги/launchMode таким образом, чтобы мое приложение не возобновляло ListActivity со старыми загруженными данными?

+0

Это происходит, когда вы покинули приложение, нажав кнопку «Назад», а затем возобновите его из списка последних приложений? Или это происходит всегда? –

ответ

0

Нельзя использовать специальные режимы запуска. Это редко требуется и только в особых обстоятельствах. Удалите все указатели launchMode из вашего манифеста. Вам также не нужно использовать эти флаги при запуске ListActivity из MainActivity:

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

Использование singleInstance режима запуска причиняет вам все эти проблемы.

+0

С режимами запуска по умолчанию, если пользователь продолжает отжимать, он увидит старый стек «ListActivity» и «MainActivity». – Vektor88

+0

Тогда вы не делаете это правильно. Когда вы запускаете «ListActivity»? Объясните больше своей архитектуры, пожалуйста. –

+0

У вас должно быть только 1 'MainActivity' и 1' ListActivity', но для этого вам не нужны специальные режимы запуска. –

0

Предполагая, что вы отбросите все флаги запуска и флаги, тогда жизненный цикл активности предоставит вам всю информацию, необходимую для реализации приложения, как вы описали, - возможно, есть что-то, чего вы еще не добавили?

После того, как приложение перейдет на задний план, тогда ListActivity будет разрешено сохранять его состояние, даже если система убьет ваш процесс (нехватка памяти и т. Д.), А затем - запуск вашего приложения сначала приведет к возврату ListActivity с ранее сохраненным состояние экземпляра. Таким образом, у вас не будет поведения, если вы опишете следующее: when I restart MainActivity and select a category, ListActivity resumes the old Activity showing data belonging to the previously chosen category.

И все же, если вам нужно сохранить свой текущий дизайн, вам следует как-то сообщить ListActivity о новых изменениях данных, вопрос в том, что ListActivity.onNewIntent вообще вызывается случай, который вы описываете? Вы пробовали добавить Intent.FLAG_ACTIVITY_SINGLE_TOP: согласно этой записи в блоге: http://www.acnenomor.com/1094151p2/bug-onnewintent-not-called-for-singletop-activity-with-intentflagactivitynewtask?

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