2016-09-30 95 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()