google docs および Service broadcast doc に記載されているLocalBroadcastManager
の使用方法/検索方法
私はそれをグーグルしようとしました、しかし最初に利用できるコードがありません?
ドキュメントには、私が自分のアプリのプロセスで内部的にブロードキャストを行いたいのであればそれを使うべきだと書かれていますが、どこを探すべきかはわかりません。
何か手助け/コメント?
更新 :私はBroadcastsの使い方を知っていますが、私のプロジェクトでLocalBroadcastManager
を利用可能にする方法を知りません。
とにかく私は答えます。万が一誰かがそれを必要としています。
"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();
}
通知を送信/ブロードキャストする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!
総合的にお答えしたいのですが。
LocalbroadcastManagerはAndroid 3.0以降に含まれているため、初期のリリースではサポートライブラリv4を使用する必要があります。指示を参照してください ここ
放送受信機を作成します。
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 !");
}
};
次のようなアクティビティの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.
onPauseで受信機の登録を解除します。
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
}
ローカルブロードキャストがアプリケーションのアクティビティまたはサービスから送信されるたびに、onNoticeのonReceiveが呼び出されます。
編集:あなたはここで完全なチュートリアルを読むことができます LocalBroadcastManager:イントラアプリケーションメッセージの受け渡し
受信側で:
次に、受信意図データを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);
Eclipseでは、結局私は自分のプロジェクトを右クリックして以下を選択してCompatibility/Support Libraryを追加する必要がありました。
Android Tools - > Add Support Library
それが追加されたら、それから私は私のコードでLocalBroadcastManager
クラスを使うことができました。
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
交換する
registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
あり
localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
交換する
sendBroadcast(intent);
あり
localBroadcastManager.sendBroadcast(intent);
交換する
unregisterReceiver(mybroadcast);
あり
localBroadcastManager.unregisterReceiver(mybroadcast);
LocalBroadcastReceiverで十分に遊べるようになったら、 Green RobotのEventBus tryを試してみることをお勧めします - LBRと比べて、その違いと有用性を確実に理解できます。少ないコード、受信者のスレッド(UI/Bg)、受信者の可用性の確認、スティッキーイベント、イベントなどについてカスタマイズ可能.
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
オブジェクトはライフサイクルに対応しているという事実は、それらを複数のアクティビティ、フラグメント、およびサービス間で共有できることを意味します。
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