0

にbroadcastReceiversをバインドする方法を私はonInactive()onActive()コールバックで多くのBroadcastReceiverの登録を解除し、登録できるようにしたいと思います。だから私はこのような何かをしたい:AndroidのアーキテクチャコンポーネントLiveData - Androidの<a href="https://developer.android.com/reference/android/arch/lifecycle/LiveData.html" rel="nofollow noreferrer">LiveData</a>を使用して、ライフサイクル

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を実装する必要があります。 GoogleのcodelabからLiveDataドキュメントを1として 、

注意:ViewModelににコンテキストまたはビューへの参照を保存することができ、メモリリークで 結果。 コンテキストまたはビュークラスのインスタンスを参照するフィールドは避けてください。 onCleared()メソッドは、 ライフサイクルが長い他のオブジェクトへの参照の登録解除またはクリアには便利ですが、ContextオブジェクトまたはViewオブジェクトへの参照のクリアには使用できません。

したがって、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: 'アプリケーションコンテキスト'を渡さないで、 'activity'コンテキストを渡してください! – AndiGeeky

+0

@ j2emanue:回答の中で言及された参照コードリスト。それには位置リスナが付いています。代わりに、あなたの放送受信機を使用することができます! – AndiGeeky

関連する問題

 関連する問題