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.
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. –