LocalBroadcastManager是support
v4包里提供的一个组件,它只负责进程内发送广播和接收消息,它的优点如下:
广播消息只在进程内发送,不会造成数据泄露
只接收进程内的广播消息,不会有广播方面的安全问题
比全局的广播效率更高
LocalBroadcastManager的实现原理:我们通常都是通过LocalBroadcastManager.getInstance(Context
context)来获得它的实例的,通过查看LocalBroadcastManager的代码,笔者发现它的实现并不复杂,它其实是一个单实例对象,那么我们在整个进程内使用的其实是一个LocalBroadcastManager对象,这个单实例对象负责注册消息和分发消息。
了解了一下它的原理,下面我们就用一个小demo来使用一下它吧:
Activity布局文件的代码
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.androidtest.LocalBroadCastMgrActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/tvReceiver"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"
android:id="@+id/button24"
android:layout_below="@+id/tvReceiver"
android:layout_centerHorizontal="true"
android:layout_marginTop="94dp"
android:onClick="onBtnSendClick"
/>
Java代码
package com.example.administrator.androidtest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import
android.support.v4.content.LocalBroadcastManager;
import
android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class LocalBroadCastMgrActivity extends Activity
{
LocalBroadcastManager localBroadcastManager;
MyMsgReceiver
myMsgReceiver;
TextView tvReceiver
;
public static String
BROADCAST_ACTION = "com.bcoder.test.localbroadcast";
public static String
INTENTEXTRA_MYWEBSITE = "mywebsite";
@Override
protected void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_broad_cast_mgr);
tvReceiver = (TextView)
findViewById(R.id.tvReceiver);
}
@Override
protected void
onStart() {
super.onStart();
myMsgReceiver = new MyMsgReceiver();
IntentFilter intentFilter = new
IntentFilter(BROADCAST_ACTION);
localBroadcastManager =
LocalBroadcastManager.getInstance(this);
//注册广播消息接收器
localBroadcastManager.registerReceiver(myMsgReceiver,
intentFilter);
}
@Override
protected void
onStop() {
//删除已注册的广播
localBroadcastManager.unregisterReceiver(myMsgReceiver);
super.onStop();
}
public void
onBtnSendClick(View v){
Intent intent = new
Intent(BROADCAST_ACTION);
intent.putExtra(INTENTEXTRA_MYWEBSITE,
"http://www.bcoder.com");
//在其他Activity或者服务中使用时可以直接使用LocalBroadcastManager.getInstance,不用再定义变量
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
//定义自己的广播接收类
class MyMsgReceiver
extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent
intent) {
if(null !=
intent && null !=
intent.getStringExtra(INTENTEXTRA_MYWEBSITE)){
tvReceiver.setText(String.format("我的网站: %s",
intent.getStringExtra(INTENTEXTRA_MYWEBSITE)));
}
}
}
}
注意事项:
Android桌面组件和app不在一个进程内,不能使用LocalBroadcastManager进行广播
LocalBroadcastManager注册的消息只有使用LocalBroadcastManager发送才能接收到,同样LocalBroadcastManager发出的消息只有它注册的消息才能接收
LocalBroadcastManager和全局广播可以同时使用,以便于和其它的app进行通讯