android本地普通广播,BroadcastReceiver Android的广播解析

1、广播是一种运用在应用程序之间传递消息的机制,广播接收者是用来过滤、接受并响应广播的一类组件。

1.1广播分为普通广播和有序广播,下面分别图解:

561f592b54f7ea0d4e00f702d4207297.png

普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

99cd062784f1d60a739573af8eb8749b.png

有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。(后面还有有序广播的深入补充)

2、广播的创建与接收(普通广播)

步骤2.1:创建一个FirstBroadcast类继承自BroadcastReceiver 实践证明这个接收者不需要初始化,会自动接收发出的广播

public class FirstBroadcast extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

Toast.makeText(context, "this is first Broadcast", 3000).show();

//abortBroadcast(); //这个是后面用来实现有序广播截断后面的广播的

}

}

2.2在Manifest中对这个广播接收者进行注册

//这个是你的类的全路径

//priority是优先级,优先级高的广播接收者先执行

//这个是Intent隐式意图的匹配项

intent-filter>

receiver>

2.3发送广播

public void onClick(View v) {

switch (v.getId()) {

case R.id.button1:

Intent intent = new Intent("My_Broadcast");

sendBroadcast(intent, null);

break;

default:

break;

}

}

小结:

1、是用intent意图启动广播,那么还可以用intent.putExtra(name, value)方法来添加信息

2、原理是我们创建了一个BroadcastReceiver类,通过intent发送一条名为My_Broadcast的广播,同时我们在manifest中声明的相匹配,于是我们的MyBroadcast接收到了这个广播。

3、有序广播的理解

3.199cd062784f1d60a739573af8eb8749b.png

我们刚刚创建了一个广播接收器,下面再创建一个项目来创建第二个广播接收器,

注意上面的第一个广播接收器的优先级是90,下面这个是100,所以会优先被下面这个接收器收到。

public class AnotherBroadcast extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

Toast.makeText(context, "This is AnotherBroadcast", 3000).show();

}

}

同时也要在manifest中声明receiver

intent-filter>

有序广播的sendbroadcast方法

sendBroadcast(intent, null);

这个时候点sendBroadcast会一次输出”This is AnotherBroadcast”,”this is first Broadcast”。

为了证明有序广播是可以截断的,我们可以把FirstBroadcast中的//abortBroadcast();取消注释,这个方法是停止广播的意思,再点按钮发送广播我们会发现只输出了”This is AnotherBroadcast”,然后就截断了。

4、本地广播

这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,增加了安全性。

那么怎么创建本地广播呢?

步骤:(对应的序号会标在代码后面)

4.1创建一个本地广播的管理者

4.2声明intentFilter

4.3实例化接收者

4.4注册广播管理者

public class MainActivity extends Activity {

private LocalBroadcastManager localBroadcastManager;

private IntentFilter intentFilter;

private LocalBroadcast localBroadcast;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent("LocalBroadcast");

localBroadcastManager.sendBroadcast(intent);

}

});

localBroadcastManager = LocalBroadcastManager.getInstance(this);//4.1

intentFilter = new IntentFilter("LocalBroadcast");//4.2

// intentFilter.addAction();

localBroadcast = new LocalBroadcast();//4.3

localBroadcastManager.registerReceiver(localBroadcast, intentFilter);//4.4 参数分别是广播接受者和intentFilter

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

localBroadcastManager.unregisterReceiver(localBroadcast);

}

public class LocalBroadcast extends BroadcastReceiver{

public void onReceive(Context context, Intent intent) {

Toast.makeText(MainActivity.this, "This is LocalBroadcast", 2000).show();

}

}

}

先这样吧,也是刚学,自己总结的一点通俗易懂的经验,后面会学习补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值