当前位置: 首页 > 知识库问答 >
问题:

Android broadcast receiver on receive()在android 4.0上调用了两次

陶高峯
2023-03-14

我在android 4.0.3上遇到了一个问题(在4.1.2上运行良好)。我的活动中有一个广播接收器。当我发送广播时,方法onReceive()总是调用两次。请给我任何关于4.0和4.1广播接收器差异的建议

private final GcmBroadcastReceiver gcmReceiver = new GcmBroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action != null && action.equals(MyBroadcastReceiver.ACTION)) {
            Log.d("tag", intent.getStringExtra("alert"));
            }
        }
    };

};


@Override
protected void onPause() {
    unregisterReceiver(gcmReceiver);
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    registerGcmReceiver();
}

private void registerGcmReceiver() {
    IntentFilter filter = new IntentFilter(MyBroadcastReceiver.ACTION);
    filter.setPriority(2);
    filter.addCategory("com.android.mypackage");
    registerReceiver(gcmReceiver, filter);
}

共有3个答案

史阳晖
2023-03-14

简而言之:没有区别。两者的< code>BroadcastReceiver类来自Android 2.3.2 r1。

我遇到过类似的问题,但对我来说,这是带有Android 2.3.5的HTC Desire HD - 来自GCM的通知总是会收到两次。我没有设法找到问题的根源,但有一个解决方法。您可以为服务器中的每个通知生成唯一的 ID,并将其与实际数据一起发送。然后,在接收器中,可以更新唯一 ID 到通知数据的映射,如果已有给定 ID 的数据,请忽略它。

我可能没有说清楚,所以这里有一个例子:

public void onReceive(Context context, Intent intent) {
    String id = intent.getStringExtra("notificationID");
    if (myMap.get(id) != null)
        return;

    final String action = intent.getAction();
    if (action != null && action.equals(MyBroadcastReceiver.ACTION)) {
        Log.d("tag", intent.getStringExtra("alert"));
        myMap.put(id, *any value you need*);
    }
}

如果您不需要存储其他数据,您可以使用HashSet而不是Map,只需检查它是否包含ID。

梁丘扬
2023-03-14

我也有同样的问题。

onReceive()被调用两次,因为我注册了两次广播接收器。一个在我的活动的onCreate()中,另一个在清单中。

我从onCreate()中删除了广播接收器注册,它工作正常。只在其中一个中注册您的广播接收器。

有两种方法可以做到这一点:

  • 静态地在清单文件中。
  • 在代码中动态。

何时使用哪种方法(静态或动态)完全取决于您尝试执行的操作。基本上,当您想通过收听系统范围的事件或其他应用程序发送的事件在状态栏中显示一些通知或某些指示器来在屏幕上(主屏幕,启动器,状态栏等)上进行一些更改时,那么使用静态注册的广播接收器是有意义的。根据类似的事件,您希望在用户使用应用程序时直接在应用程序中进行更改,或者将其置于后台,因此使用动态注册的接收器是有意义的,这些接收器将持续到注册组件被销毁。

更多信息:http://codetheory.in/android-broadcast-receivers/

曹超
2023-03-14

通常onReceive会被调用两次,因为人们在两个位置注册广播,很可能您正在onCreate和onResume中注册。(选择一个地点进行注册)尽管您可能已经做了十几次了,但始终建议您再看一眼活动生命周期

 类似资料:
  • 问题内容: 我现在正在做的结果是: 在第二个readEntity()上,因为它在第一次读取后关闭了流。 这是我在做什么: 问题答案: /您可以使用,这将允许您多次读取实体流。 更新资料 使用读取实体后,读取结果将被缓存,并且可用于调用。这些信息并不能真正回答OP的问题,但我认为添加信息非常有用。

  • 问题内容: 我有使用JQuery..I米一个问题在我的代码发送字段名和序列号,其通过获取其数据的ctrller 和并且与序列表中没有given..And生成预览显示面板更新字段名与插入的字段..现在,我再次尝试更改字段名称。tat是现在,当我单击生成的显示面板字段时,相应的设置将打开,我将尝试立即更改字段名称 两者和都相同..在我发送的是字段名和序列号 在功能2中,我要发送相同的字段名和(但其他值

  • 问题内容: 如果我在节点中编写以下程序: 然后在服务器上单击两次,在服务器上看到两次- 我不确定为什么单个HTTP请求导致两次执行。 问题答案: 那是正常现象-您的浏览器拨打了多个电话。 例如,大多数浏览器都会呼叫来获取。 尝试记录网址: 然后您会看到正在调用的内容。

  • 问题内容: 我是angular js的新手,目前仍然遇到非常有线的bug。控制器中的函数在按路由加载视图调用时会运行两次。 http://jsfiddle.net/4gwG3/5/ 您将看到两次警报! 我的观点很简单 我的应用程序代码如下 问题答案: 首先检查您是否没有两次初始化Angular应用程序(通过使用 ng-app 自动进行初始化)。 一次,我有2个带有ng-app的html页面(一个用

  • 在我的应用程序中,我将TextWatcher放在EditText上。当我更改EditText的文本时,TextWatcher的事件会被调用两次。 我正在使用模拟器来运行应用程序。

  • 我正在开发一个应用程序使用Android4.0IC和碎片。 考虑ICS4.0.3(API level 15)API的演示示例应用程序中的修改示例: }