Дочерняя активность TabActivity с BroadcastReceiver остается в фоновом режиме

У меня есть TabActivity с именем MyTabActivity, содержащий несколько вкладок, которые я создаю с помощью этого кода:

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;
    }
}

One of the activities on a tab (MyTab2) registers a BroadcastReceiver so that on a specific event, the tab will refresh its displayed data. I am not unregistering the BroadcastReceiver in onPause, because I want this activity to refresh itself even if it is not currently in front.

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();
    }

Моя проблема в том, что я обнаружил, что даже после резервного копирования активности, предшествовавшей отображению MyTabActivity, и запуска MyTabActivity во второй раз экземпляр MyTab2, созданный при первом входе в MyTabActivity, кажется, все еще жив, и когда я транслировать событие, которое запускает вкладку для обновления своих данных, что и старый экземпляр MyTab2, и новый экземпляр MyTab2 обновляются, потому что оба получают широковещательную рассылку. Мой вопрос: как я могу убить все дочерние действия TabActivity при отказе от TabActivity?

Остаются ли старые экземпляры дочерних действий, потому что я не отменяю регистрацию BroadcastReceiver, когда действие уходит с фронта?

Как вы понимаете, эта проблема усугубляется каждый раз, когда запускается последующая активность MyTabActivity.


person Community    schedule 01.11.2012    source источник


Ответы (1)


Не нужно транслировать это:

Вместо этого:

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);

просто сделайте это

 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);

Вот и все, ваша проблема будет решена

person Narendra Pal    schedule 29.12.2012
comment
Intent.FLAG_ACTIVITY_CLEAR_TOP, этот оператор очищает верхнюю активность, которая добавляется в стек. и после этого вызывается onCreate(). Это произошло в моем случае. - person Narendra Pal; 23.02.2013