广播收到多次关闭和开放活动

时间:2016-09-30 12:59:03

标签: android service broadcastreceiver fragment

我有以下问题: 一个片段让我多次看到一个broadcastRecivier:

onCreate my fragment:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Filtro de acciones que serán alertadas
    IntentFilter filter = new IntentFilter("serv_connected");
    filter.addAction("amigos_list");

    // Crear un nuevo ResponseReceiver
    receiver = new ResponseReceiverFragment();

    // Registrar el receiver y su filtro
    LocalBroadcastManager.getInstance(getContext()).registerReceiver(
            receiver,
            filter);
    activity = ((SocialActivity) getActivity());

}

这是广播,这是我的片段;

// Broadcast receiver que recibe las emisiones desde los servicios
private class ResponseReceiverFragment extends BroadcastReceiver {

    // Sin instancias
    private ResponseReceiverFragment() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        switch (intent.getAction()) {

            case "serv_connected":
                MyService aux = activity.getmService();
                mUserList = MyService.xmpp.getOnlineUsers();

                iconloader.hide();
                break;

        }
    }
}

该片段位于包含3个带滑动标签的片段的活动中,并不罕见。

问题如下: 当我进入并触发广播活动时,片段正确接收。 现在,如果我回来,(关闭活动)并再次打开活动,片段接收两次广播,依此类推等等。

发生了什么事? 如果您需要更多代码,我可以添加。

谢谢

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并且使用了一个非常简单的解决方案。我只是添加了一个标志值来检查广播是否已被触发。

boolean broadcastTriggerd = false;
@Override
public void onReceive(Context context, Intent intent) {
 if(!broadcastTriggered){
    broadcastTriggerd = true;
    switch (intent.getAction()) {

        case "serv_connected":
            MyService aux = activity.getmService();
            mUserList = MyService.xmpp.getOnlineUsers();

            iconloader.hide();
            break;

       }
   }
}

答案 1 :(得分:1)

正如评论中所讨论的,问题是您没有取消注册片段OnDestroy()中的接收者。

关于您注册接收者的上下文,这不是一个简单的答案,但您可以更详细地阅读here

答案 2 :(得分:0)

由于评论我成功解决了问题:

1º - 必须在onDestroy中取消注册o OnPause:

        getActivity().registerReceiver(receiver, filter);

2º发布广播时,他这样做了:

            LocalBroadcastManager.getInstance(getBaseContext()).sendBroadcast(localIntent);

但有必要这样做:

            getApplicationContext().sendBroadcast(localIntent);

仍然我不明白为什么(1个月前我在android中编程)

如果有人能解释它,请欣赏。

问候语

答案 3 :(得分:0)

在onPause()

中删除了接收器取消注册后,我的问题得以解决