Связь между C2DM BroadcastReceiver и несколькими действиями - PullRequest
1 голос
/ 01 декабря 2011

У меня есть приложение для Android, которое использует службы C2DM (он же push).

У меня есть отдельный класс, который реализует процесс регистрации и получает данные (и расширяет BroadcastReceiver).

Я хочу сообщить эти данные деятельности, которая в настоящее время находится на переднем плане. Активность в данный момент на переднем плане может отличаться в зависимости от действий пользователя.

Какой лучший способ связи между получателем и текущей активностью?

Спасибо.

1 Ответ

2 голосов
/ 09 февраля 2012

Я решил эту проблему, отправив новую трансляцию из класса C2DMReceiver, которая выглядела примерно так:

Класс C2DMReceiver:

public class C2DMReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {    
            handleRegistration(context, intent);
        } else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
            handleMessage(context, intent);
        }
    }

    private void handleRegistration(Context context, Intent intent) {
        // handle registration
    }

    private void handleMessage(Context context, Intent intent) {
        Intent i = new Intent("push");
        i.putExtras(intent);
        // context.sendOrderedBroadcast(i, null);
        context.sendBroadcast(i);
    }

}

Другой класс, который я назвал PushReceiver. Это класс, который расширит BroadcastReceiver и получит широковещательную рассылку, отправленную C2DMReceiver.

public class PushReceiver extends BroadcastReceiver {

    public PushReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // do stuff
        abortBroadcast();
    }

    public static class PushFilter extends IntentFilter {

        private static final int DEFAULT_PUSH_PRIORITY = 1;

        public PushFilter() {
            this(DEFAULT_PUSH_PRIORITY);
        }

        public PushFilter(int priority) {
            super("push");
            setPriority(priority);
        }

    }

}

И класс активности, в данном случае, называется MyActivity. Это должно хорошо работать, если вы используете базовый класс действий, который расширяют все остальные действия. Таким образом, каждое действие регистрирует получателя. Выполняя регистрацию / отмену регистрации в onResume / onPause, вы должны быть в состоянии гарантировать, что только текущая активность получает трансляцию. Если нет, вы можете отправить заказанную трансляцию из C2DMReceiver и использовать приоритет в PushFilter.

public class MyActivity extends Activity {

    private PushReceiver pushReceiver;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // your onCreate method
        pushReceiver = new PushReceiver();
    }

    public void onResume() {
    super.onResume();
        // your onResume method
        registerReceiver(pushReceiver, new PushReceiver.PushFilter());
    }

    public void onPause() {
        super.onPause();
        // your onPause method
        unregisterReceiver(pushReceiver);
    }

}    

В моем случае я написал конструктор PushReceiver для использования View, а затем «сделал вещи» с представлением в методе onReceive. Не зная больше о том, что вы пытаетесь сделать, я не могу подробно остановиться на этом, но, надеюсь, это может обеспечить достойный шаблон для работы.

...