android - C2DM BroadcastReceiver 与多个 Activity 之间的通信

标签 android broadcastreceiver push android-c2dm

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

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

我想将此数据传递给当前在前台的 Activity 。当前在前台的 Activity 可能因用户操作而异。

在接收者和当前 Activity 之间进行通信的最佳方式是什么?

谢谢。

最佳答案

我通过从 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);
        }

    }

}

还有 Activity 类,在本例中称为 MyActivity。如果您正在使用所有其他 Activity 扩展的基本 Activity 类,这应该会很好地工作。这样每个 Activity 都会注册接收者。通过在 onResume/onPause 中注册/取消注册,您应该能够保证只有当前 Activity 接收到广播。如果没有,您可以从 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 方法中对 View 进行“处理”。在不了解您尝试做什么的情况下,我无法对此进行详细说明,但希望这可以提供一个不错的工作模板。

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

相关文章:

Android ADT 版本更新抛出错误状态

android - 收到 SMS 时发送多部分 SMS 并检查是否送达(导致 receive call notallowedexception)

git 在推送操作期间卡住了

ssl - APNS ssl ://gateway. sandbox.push.apple.com:2195 连接失败

java - Android SoundPool load()返回null

android - 从 Android 模拟器 Web 应用程序调试与 ACS 集成的 Azure Web 角色

android - 如何通过改造正确处理文本/纯文本响应?

android - 监听android中的硬件按钮点击事件

android - 是否可以从结束预付费电话后出现的对话中读取通话费用历史记录?

matrix - Julia - 如何将矩阵添加到矩阵列表中