如何使用/定位在谷歌文档和服务广播文档中描述的LocalBroadcastManager ?
我试着谷歌它,但没有可用的代码开始?
文档说,我应该使用它,如果我想做广播内部与我的应用程序的进程,但我不知道在哪里寻找这个。
任何帮助/评论?
更新:我知道如何使用广播,但不知道如何在我的项目中获得LocalBroadcastManager。
如何使用/定位在谷歌文档和服务广播文档中描述的LocalBroadcastManager ?
我试着谷歌它,但没有可用的代码开始?
文档说,我应该使用它,如果我想做广播内部与我的应用程序的进程,但我不知道在哪里寻找这个。
任何帮助/评论?
更新:我知道如何使用广播,但不知道如何在我的项目中获得LocalBroadcastManager。
当前回答
我更愿意全面地回答。
LocalbroadcastManager included in android 3.0 and above so you have to use support library v4 for early releases. see instructions here Create a broadcast receiver: 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 !"); } }; Register your receiver in onResume of activity like: 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. unRegister receiver in onPause: protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); } Now whenever a localbroadcast is sent from applications' activity or service, onReceive of onNotice will be called :).
编辑:你可以在这里阅读完整的教程LocalBroadcastManager:内部应用程序消息传递
其他回答
在Eclipse中,最终我不得不通过右键单击我的项目并选择添加兼容性/支持库:
Android工具->添加支持库
一旦添加了它,我就可以在代码中使用LocalBroadcastManager类了。
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对象被销毁之后,观察者就被销毁了 自动删除
LiveData对象能够感知生命周期这一事实意味着您可以在多个活动、片段和服务之间共享它们。
一个实现LocalBroadcastManager的Activity和Service的例子可以在开发者文档中找到。我个人觉得它非常有用。
编辑:该链接已从网站上删除,但数据如下: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master/support4demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java
使用LocalBroadcastManager的Kotlin版本:
请检查下面的注册代码, 发送和接收广播消息。
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()
}
}
我们也可以使用接口相同的broadcastManger在这里我分享broadcastManager的测试代码,但通过接口。
首先,创建如下界面:
public interface MyInterface {
void GetName(String name);
}
2-这是第一个需要实现的类
public class First implements MyInterface{
MyInterface interfc;
public static void main(String[] args) {
First f=new First();
Second s=new Second();
f.initIterface(s);
f.GetName("Paddy");
}
private void initIterface(MyInterface interfc){
this.interfc=interfc;
}
public void GetName(String name) {
System.out.println("first "+name);
interfc.GetName(name);
}
}
3-这里是实现相同接口的第二个类,其方法自动调用
public class Second implements MyInterface{
public void GetName(String name) {
System.out.println("Second"+name);
}
}
因此,通过这种方法,我们可以使用与broadcastManager功能相同的接口。