2012-11-01 5 views
5

Mam TabActivity nazwie MyTabActivity zawierające kilka zakładek, które tworzę przy użyciu tego kodu:TabActivity dziecko aktywny z BroadcastReceiver pozostaje żywa w tle

public class MyTabActivity extends TabActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.my_tabs); 
     tabHost = (TabHost)findViewById(android.R.id.tabhost); 
     tabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider); 
     Intent intent = new Intent().setClass(this, MyTab1.class); 
     setupTab(new TextView(this), "Tab1", intent); 
     intent = new Intent().setClass(this, MyTab2.class); 
     setupTab(new TextView(this), "Tab2", intent); 
     intent = new Intent().setClass(this, MyTab3.class); 
     setupTab(new TextView(this), "Tab3", intent); 
    } 

    private void setupTab(final View view, final String tag, Intent intent) { 
     View tabview = createTabView(tabHost.getContext(), tag); 
     TabHost.TabSpec setContent = tabHost.newTabSpec(tag).setIndicator(tabview).setContent(intent); 
     tabHost.addTab(setContent); 
    } 

    private static View createTabView(final Context context, final String text) { 
     View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); 
     TextView tv = (TextView) view.findViewById(R.id.tabsText); 
     tv.setText(text); 
     return view; 
    } 
} 

Jednym z działań na zakładkę (MyTab2) rejestrach a BroadcastReceiver, aby w określonym zdarzeniu karta odświeżyła wyświetlane dane. Nie wyrejestrowuję BroadcastReceiver w funkcji onPause, ponieważ chcę, aby ta czynność odświeżyła się, nawet jeśli nie jest aktualnie na wierzchu.

public class MyTab2 extends Activity { 

    // listener to receive broadcasts from activities that change 
    // data that this activity needs to refresh on the view 
    protected class MyListener extends BroadcastReceiver { 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals("myapp.REFLECT__CHANGES")) { 
       //request new data from the server 
       refreshData(); 
      } 
     } 
    } 

    protected void onResume() { 
     // if listener is not registered yet, register it 
     // normally we would unregister the listener onPause, but we want 
     // the listener to fire even if the activity is not in front 
     if (!listenerIsRegistered) { 
      registerReceiver(listener, new IntentFilter("myapp.REFLECT_CHANGES")); 
      listenerIsRegistered = true; 
     } 
     super.onResume(); 
    } 

Moim problemem jest to, że jestem stwierdzenia, że ​​nawet po zrobieniu kopii zapasowej do aktywności, która poprzedzała wyświetlanie MyTabActivity i rozpoczęcie MyTabActivity po raz drugi, że wystąpienie MyTab2, który został stworzony na pierwszym wejściu do Wydaje się, że MyTabActivity wciąż żyje i kiedy rozgłaszam zdarzenie, które wyzwala kartę, aby odświeżyć dane, to zarówno stara instancja MyTab2, jak i nowa instancja MyTab2 są odświeżane, ponieważ oba odbierają transmisję. Moje pytanie brzmi: jak mogę zabić wszystkie czynności podrzędne TabActivity podczas wycofywania się z TabActivity?

Czy starsze przypadki aktywności dzieci pozostają w pobliżu, ponieważ nie wyrejestrowuję BroadcastReceiver, gdy działalność opuszcza front?

Jak można sobie wyobrazić, problem ten jest komplikowany za każdym razem, gdy rozpoczyna się kolejna aktywacja MyTabActivity.

Odpowiedz

1

Nie trzeba nadawać ten:

instaed w ten sposób:

Intent intent = new Intent().setClass(this, MyTab1.class); 
     setupTab(new TextView(this), "Tab1", intent); 
     intent = new Intent().setClass(this, MyTab2.class); 
     setupTab(new TextView(this), "Tab2", intent); 
     intent = new Intent().setClass(this, MyTab3.class); 
     setupTab(new TextView(this), "Tab3", intent); 

prostu zrobić to

tabHost = (TabHost)findViewById(android.R.id.tabhost); 
     tabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider); 
     Intent intent = new Intent().setClass(this, MyTab1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     setupTab(new TextView(this), "Tab1", intent); 
     intent = new Intent().setClass(this, MyTab2.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     setupTab(new TextView(this), "Tab2", intent); 
     intent = new Intent().setClass(this, MyTab3.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     setupTab(new TextView(this), "Tab3", intent); 

to wszystko, a problem będzie rozwiązany

+0

Intent.FLAG_ACTIVITY_CLEAR_TOP, to polecenie usuwa najważniejsze działanie, które jest dodawane do stosu. a następnie wywoływana jest funkcja onCreate(). Tak stało się w moim przypadku. –