web-dev-qa-db-ja.com

LocalBroadcastManagerを使用する方法?

google docs および Service broadcast doc に記載されているLocalBroadcastManagerの使用方法/検索方法

私はそれをグーグルしようとしました、しかし最初に利用できるコードがありません?

ドキュメントには、私が自分のアプリのプロセスで内部的にブロードキャストを行いたいのであればそれを使うべきだと書かれていますが、どこを探すべきかはわかりません。

何か手助け/コメント?

更新 :私はBroadcastsの使い方を知っていますが、私のプロジェクトでLocalBroadcastManagerを利用可能にする方法を知りません。

418
waqaslam

とにかく私は答えます。万が一誰かがそれを必要としています。

ReceiverActivity.Java

"custom-event-name"という名前のイベントの通知を監視するアクティビティ。

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

SenderActivity.Java

通知を送信/ブロードキャストする2番目のアクティビティ。

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Every time a button is clicked, we want to broadcast a notification.
  findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendMessage();
    }
  });
}

// Send an Intent with an action named "custom-event-name". The Intent sent should 
// be received by the ReceiverActivity.
private void sendMessage() {
  Log.d("sender", "Broadcasting message");
  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "This is my message!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

上記のコードでは、ボタンR.id.button_sendがクリックされるたびにインテントがブロードキャストされ、mMessageReceiver内のReceiverActivityによって受け取られます。

デバッグ出力は次のようになります。

01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message! 
813
Shiki

総合的にお答えしたいのですが。

  1. LocalbroadcastManagerはAndroid 3.0以降に含まれているため、初期のリリースではサポートライブラリv4を使用する必要があります。指示を参照してください ここ

  2. 放送受信機を作成します。

    private BroadcastReceiver onNotice= new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // intent can contain anydata
            Log.d("sohail","onReceive called");
            tv.setText("Broadcast received !");
    
        }
    };
    
  3. 次のようなアクティビティのonResumeに受信機を登録します。

    protected void onResume() {
            super.onResume();
    
            IntentFilter iff= new IntentFilter(MyIntentService.ACTION);
            LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff);
        }
    
    //MyIntentService.ACTION is just a public static string defined in MyIntentService.
    
  4. onPauseで受信機の登録を解除します。

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
    
  5. ローカルブロードキャストがアプリケーションのアクティビティまたはサービスから送信されるたびに、onNoticeのonReceiveが呼び出されます。

編集:あなたはここで完全なチュートリアルを読むことができます LocalBroadcastManager:イントラアプリケーションメッセージの受け渡し

124
SohailAziz

受信側で:

  • 最初に登録します
  • 次に、受信意図データをonReceiveで処理します。

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
          lbm.registerReceiver(receiver, new IntentFilter("filter_string"));
      }
    
      public BroadcastReceiver receiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              if (intent != null) {
                  String str = intent.getStringExtra("key");
                  // get all your data from intent and do what you want 
              }
          }
      };
    

送信終了時:

   Intent intent = new Intent("filter_string");
   intent.putExtra("key", "My Data");
   // put your all data using put extra 

   LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
33
waqas ali

Eclipseでは、結局私は自分のプロジェクトを右クリックして以下を選択してCompatibility/Support Libraryを追加する必要がありました。

Android Tools - > Add Support Library

それが追加されたら、それから私は私のコードでLocalBroadcastManagerクラスを使うことができました。


Android Compatibility Library

27
waqaslam

グローバル放送をLocalBroadcastに変更する方法

1)インスタンスを作成する

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2)BroadcastReceiverを登録するため

交換する

registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

あり

localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

3)同報メッセージ送信用

交換する

sendBroadcast(intent);

あり

localBroadcastManager.sendBroadcast(intent);

4)同報メッセージの登録解除

交換する

unregisterReceiver(mybroadcast);

あり

localBroadcastManager.unregisterReceiver(mybroadcast);
9
Rohit Singh

LocalBroadcastReceiverで十分に遊べるようになったら、 Green RobotのEventBus tryを試してみることをお勧めします - LBRと比べて、その違いと有用性を確実に理解できます。少ないコード、受信者のスレッド(UI/Bg)、受信者の可用性の確認、スティッキーイベント、イベントなどについてカスタマイズ可能.

4
Stan

androidx.localbroadcastmanager バージョンでは非推奨となっています 1.1.0

理由

LocalBroadcastManagerはアプリケーション全体のイベントバスであり、アプリ内のレイヤ違反を受け入れます。どのコンポーネントも他のコンポーネントからのイベントを監視できます。 BroadcastManagerシステムの不要なユースケース制限を継承しています。オブジェクトは1つのプロセスにしか存在せず、それを決して離れない場合でも、開発者はIntentを使用する必要があります。これと同じ理由で、機能的なBroadcastManagerには従っていません。

これらは、紛らわしい開発者体験につながります。

置き換え

LocalBroadcastManagerの使用法を他の観測パターンの実装に置き換えることができます。ユースケースに応じて、適切なオプションは LiveData または反応型ストリームです。

LiveDataの利点

シングルトンパターンを使用してLiveDataオブジェクトを拡張し、システムサービスをラップしてアプリ内で共有できるようにすることができます。 LiveDataオブジェクトはシステムサービスに一度接続すると、リソースを必要とするオブザーバはLiveDataオブジェクトを見ることができます。

 public class MyFragment extends Fragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        LiveData<BigDecimal> myPriceListener = ...;
        myPriceListener.observe(this, price -> {
            // Update the UI.
        });
    }
}

observe()メソッドは最初の引数としてLifecycleOwnerのインスタンスであるフラグメントを渡します。そうすることは、このオブザーバが所有者に関連するLifecycleオブジェクトに束縛されることを意味します。

  • Lifecycleオブジェクトがアクティブ状態にない場合は、値が変更されてもオブザーバは呼び出されません。

  • Lifecycleオブジェクトが破棄された後、オブザーバは自動的に削除されます

LiveDataオブジェクトはライフサイクルに対応しているという事実は、それらを複数のアクティビティ、フラグメント、およびサービス間で共有できることを意味します。

4
Darish

LocalBroadcastManagerを実装したActivityとServiceの例は、開発者 docs にあります。私は個人的に非常に便利だと思いました。

編集:その後、リンクはサイトから削除されましたが、データは次のとおりです。 https://github.com/carrot-garden/Android_maven-Android-plugin-samples/blob/master/support4demos/src /com/example/Android/supportv4/content/LocalServiceBroadcaster.Java

2
nindalf