我有一个使用C2DM服务(又称推送)的Android应用程序。

我有一个单独的类,该类实现注册过程并接收数据(并扩展了BroadcastReceiver)。

我想将此数据传达给当前处于前台的活动。当前在前台的活动可能会根据用户操作而有所不同。

接收者和当前活动之间进行交流的最佳方式是什么?

谢谢。

最佳答案

我通过从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方法中对该视图进行“处理”。在不了解您要做什么的情况下,我无法对此进行详细说明,但是希望这可以提供一个不错的模板来进行工作。

关于android - C2DM BroadcastReceiver与多个 Activity 之间的通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8332686/

10-12 05:10