Я решил эту проблему, отправив новую трансляцию из класса 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. Не зная больше о том, что вы пытаетесь сделать, я не могу подробно остановиться на этом, но, надеюсь, это может обеспечить достойный шаблон для работы.