我还是会回答这个问题,以防有人需要。
一个观察名为"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();
}
发送/广播通知的第二个活动。
@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
时,就会广播一个 Intent,并由 ReceiverActivity
中的 mMessageReceiver
接收。调试输出应该如下所示:
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!
onDestroy()
不能保证被调用!因此,您必须使用onPause()
(因为它是唯一能够保证调用的方法)和onResume()
(因为它对应于onPause()
)。请注意不要改变原文意思。 - 18446744073709551615onDestroy()
没问题。它不被调用的情况是当应用被杀死时,如果在那种情况下您没有注销,也没有关系,因为即使注册接收器的列表也不会幸存下来。 - zapl我更倾向于全面回答。
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 !");
}
};
在activity的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:应用程序内消息传递
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);
进行注册,并使用 LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
取消注册。 - PeteHonStop
,因为在 Android API 24+ 中,“多窗口/分屏视图”(在 API 26+ 上默认启用)中,未与之交互的活动处于暂停状态。来源:https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle - Martin Marconcini接收端:
然后在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);
Android工具 -> 添加支持库
一旦添加完成,我就可以在我的代码中使用LocalBroadcastManager
类。
androidx.localbroadcastmanager
在版本 1.1.0 中已被弃用。
原因
LocalBroadcastManager
是一个应用程序范围的事件总线,会承认您的应用程序中的层次违规;任何组件都可以监听来自任何其他组件的事件。
它继承了系统 BroadcastManager 的不必要用例限制;即使对象仅存在于一个进程中并且永远不会离开该进程,开发人员也必须使用 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 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);
LocalBroadcastManager
:请查看以下代码进行注册
、发送
和接收
广播消息。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// register broadcast manager
val localBroadcastManager = LocalBroadcastManager.getInstance(this)
localBroadcastManager.registerReceiver(receiver, IntentFilter("your_action"))
}
// broadcast receiver
var receiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent != null) {
val str = intent.getStringExtra("key")
}
}
}
/**
* Send broadcast method
*/
fun sendBroadcast() {
val intent = Intent("your_action")
intent.putExtra("key", "Your data")
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
override fun onDestroy() {
// Unregister broadcast
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)
super.onDestroy()
}
}
enter code here if (createSuccses){
val userDataChange=Intent(BRODCAST_USER_DATA_CHANGE)
LocalBroadcastManager.getInstance(this).sendBroadcast(
userDataChange
)
enableSpinner(false)
finish()
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
- MudassirLocalBroadcastManager
已被弃用。我用更好的EventBus库替换了它,个人认为这样更好。 - Kris B