2016-09-30 63 views
1

我有以下问题: 一个片段让我多次一个broadcastRecivier:广播接收多次关闭和打开活动

的onCreate我的片段:

@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片段的活动中,没有什么稀有。

问题如下: 当我输入并触发广播活动时,片段接收正确。 现在,如果我回来,(关闭活动),我再次打开活动,该片段接收广播的两倍,等等...等等等

这是怎么回事? 如果您需要更多代码,我可以添加。

谢谢

+0

我想删除的接收器注销我的问题解决了你的碎片没有被缓存或者保存状态,因此,Android会继续触发'onCreate()' - 当调用onCreate()时添加一些登录到输出,并且从那里开始,你需要弄清楚管理状态 – brandall

+0

因为我可以知道状态吗? 我知道,我没有保留任何东西或缓存:-S .... 但它不安全。 我该如何检查? 谢谢 – daicon

+0

在'onCreate()'中添加日志记录并检查logcat,以查看它被调用的次数以及调用次数 - 例如,每次在制表符之间滑动时等。一旦了解了行为,就可以搜索一篇关于如何使用滑动标签保存Fragment状态的文章。 – brandall

回答

0

我成功得益于成功解决的评论:

1° - 这是必要的,注销的onDestroyØ的onPause:

 getActivity().registerReceiver(receiver, filter); 

2º当启动他这样做广播:

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

但是有必要这样做:

  getApplicationContext().sendBroadcast(localIntent); 

不过我不明白为什么(1个月前,我在机器人程序)

如果任何人都可以解释它升值。

问候

1

我有同样的问题,用一个非常简单的solution.I一个处理它只是增加了一个标志值来检查,如果广播已被触发与否。

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; 

     } 
    } 
} 
+0

谢谢你的帮助。 但解决方案不正确。问题依然存在。 也就是说,oki现在只运行一次我想要的代码。但广播仍然发送多次,因为我关闭并打开活动.... :-( 我想了解和解决这个问题。 谢谢 – daicon

+0

我假设你还没有注销广播接收器onDestroy ()方法的活动? –

1

正如在评论中讨论的,问题是你不能在你的片段的OnDestroy()注销接收器。

在问候中您注册接收器的情况下,它不是一个简单的答案,但你可以更详细地阅读here

0

时的onPause()