android 广播分发,Android中使用LocalBroadcastManager发送进程内广播

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进行通讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值