0

使用的Android LiveData我希望能夠在onInactive()onActive()回調註銷和註冊許多BroadcastReceiver秒。所以,我想要做這樣的事情:Android的架構組件LiveData - 如何broadcastReceivers綁定到生命週期

public class BroadcastRecieverLiveData extends LiveData<BroadCastReciever> { 
    private BroadcastReciever reciever; 
    private Context context; 

    public BroadcastRecieverLiveData(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected void onActive() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("SOME_ACTION"); 
     filter.addAction("SOME_OTHER_ACTION"); 

     reciever = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       //do something based on the intent's action 
      } 
     }; 
     registerReceiver(reciever, filter); 
    } 

    @Override 
    protected void onInactive() { 
     if (reciever != null) { 
      context.unregisterReceiver(reciever); 
     } 
    } 
} 

我想這可能是一個設計模式是清理的代碼,而不是中繼上onDestroy的。你對這種使用LiveData有什麼想法?有使用它here

回答

2

我覺得對於接收器時,應實現LifecycleObserver的例子。 按LiveData文件從谷歌codelab

注意:在一個視圖模型存儲到上下文或視圖的引用可以 導致內存泄漏。避免引用Context或View類的實例的字段。該onCleared()方法是向其他對象 取消或明確的引用有用的具有較長的生命週期 ,但不能清除到上下文或視圖對象的引用。

所以,你不應該在LiveData做背景集約化經營。

相反,舉一個例子下面的實現,

import android.arch.lifecycle.Lifecycle; 
import android.arch.lifecycle.LifecycleObserver; 
import android.arch.lifecycle.LifecycleOwner; 
import android.arch.lifecycle.OnLifecycleEvent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

public class ReceiverManager implements LifecycleObserver { 

    private final Context mContext; 
    private final MyBrodacastReceiver myBrodacastReceiver; 

    public ReceiverManager(LifecycleOwner lifecycleOwner, 
          Context context) { 
     mContext = context; 
     myBrodacastReceiver = new MyBrodacastReceiver(); 
     lifecycleOwner.getLifecycle().addObserver(this); 

    } 

    @OnLifecycleEvent(Lifecycle.Event.ON_START) 
    void registerYourReceiver() { 
     mContext.registerReceiver(myBrodacastReceiver, new IntentFilter()); 
    } 


    @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 
    void unRegisterYourReceiver() { 
     mContext.unregisterReceiver(myBrodacastReceiver); 
    } 

    private static class MyBrodacastReceiver extends BroadcastReceiver { 

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

     } 
    } 
} 

感謝。

+0

所以你寫的是內存泄漏,因爲活動場景永遠不會正確 – j2emanue

+1

發佈@ j2emanue:通過'不應用context','activity'背景! – AndiGeeky

+0

@ j2emanue:Refere codelab在答案中提到。它附有位置監聽器。相反,您可以使用您的廣播接收器! – AndiGeeky