7

Я наблюдаю за поведением Intent.FLAG_ACTIVITY_CLEAR_TOP.Flag Activity Clear Top уничтожает целевую активность, а не создает ее

К примеру у меня есть три вида деятельности A, B и C Теперь Поток A -> B -> C

Теперь, когда я начинаю с C с этим флагом с последующим кодом.

Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent_to_a); 

AFAIK, Intent.FLAG_ACTIVITY_CLEAR_TOP должны удалить B и должен возобновить А .Это также делает то же самое, но странным образом. Удаляет B, чем удаляет A, чем создает A. Также вызывается метод onDestroy of A. Может ли кто-нибудь сказать мне, правильно это или нет? Если я не хочу, чтобы он уничтожил, что мне делать?

+2

взгляд в FLAG_ACTIVITY_REORDER_TO_FRONT, это ближе к тому, что вы хотите http://developer.android.com/reference/android/content/Intent.html –

+1

да, я посмотрел на это тоже, но я также хочу, чтобы B get destroy, FLAG_ACTIVITY_REORDER_TO_FRONT помещает A в начало ActivityStack без удаления B. –

+1

Возможно, вы могли бы использовать LocalBroadCastManager для отправки отдельного намерения в B, чтобы закончить сам, а затем использовать Reorder_to_front? Я мог бы предоставить исходный код, если это вас интересует –

ответ

3

Используйте FLAG_ACTIVITY_REORDER_TO_FRONT, а затем используйте намерение довести B до конца.

активность Б:

private BroadcastReceiver finishReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    }; 
public void onCreate() { 
LocalBroadcastManager.getInstance(this) 
       .registerReceiver(finishReceiver , 
         new IntentFilter("B-finish")); 
} 
public void onDestroy() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(
       finishReceiver); 
} 

активность С:

LocalBroadcastManager.getInstance(this).sendBroadcast(
       new Intent("B-finish")); 
Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
       startActivity(intent_to_a); 
+0

Эй, я не нашел ни одного класса, такого как LocalBroadcastManager, в моей текущей версии для Android, я использую версию Android 2.3.3, api level 10. –

+0

вам нужно добавить библиотеку поддержки v4 http : //developer.android.com/tools/extras/support-library.html –

2

Либо,
. Измените launchMode деятельности A на что-то еще из стандартного (то есть singleTask или что-то). Тогда ваш флаг FLAG_ACTIVITY_CLEAR_TOP не будет перезапущен активность A.

или

. В качестве вашего флага используйте Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP. Тогда он будет работать так, как вы пожелаете.

This question has good discussion on same topic
Android documentation говорит -

запущенный экземпляр деятельность B в приведенном выше примере будет либо получить новое намерение, вы начинаете здесь в методе onNewIntent(), или быть сама закончена и перезапущены с новым намерением.

Если он объявил свой режим запуска «множественным» (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в одном и том же намерении, он будет завершен и заново создан; для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, этот Intent будет доставлен в onNewIntent() текущего экземпляра.

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