android 广播原理,Android广播

BroadCastReceiver(广播接收者)可以以异步机制的方式处理UI主线程与其它组件之间的消息传递,也就是说他不会使主UI卡住。

一:原理

接收者与发送者之间不会相互等待。消息的发送者不必指定谁来接受广播,而是可以直接发送广播,只要设置一个用于匹配的标志,然后发送消息,不用等待接收者的响应,继续做自己的事情。可以接受到广播的组件(也就是继承自BroadCastReceiver的组件)若能匹配信息,就可以接受信息,从而完成某些操作。

二:自己发送的广播

1:创建

(1)发送者通过Intent对象携带数据信息,调用sendBroadcast(intent对象)的方法,发送消息

(2)能接受广播的组件必须继承自BroadCastReceiver,重写onReceiver方法,通过参数中的intent对象的get***Extra("键")的方法获得发送过来的消息。

(3)最重要的是BroadCastReceiver组件需要注册,注册的方式为:

2:实现

(1)主Activity(发送者)public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//界面中存在一个按钮,让按钮去触发发送广播的功能

findViewById(R.id.send).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//实例化Intent对象

Intent intent = new Intent(MainActivity.this, MyReceiver.class);

//Intent对象携带消息

intent.putExtra("name", "张三");

//发送广播(消息)

sendBroadcast(intent);

}

});

}

}

(2)接收者

//继承自BroadcastReceiver,成为广播的接收者

public class MyReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

//通过Intent对象获得发送过来的消息,输出在控制台上

System.out.println(intent.getStringExtra("name"));

}

}

(3)结果,在控制台输出

01-04 12:08:01.500: INFO/System.out(307): 张三

三:系统发送的广播

1:常见的系统广播

2:创建

(1):在onCreate方法中,动态注册广播的接收者。所谓动态注册,就是不在xml文件中注册,而是在代码中注册。

registerReceiver(接受者对象, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));//第二个参数为IntentFilter对象,他的参数为通过Intent对象获得的系统广播常量值,通过与这个常量值的匹配完成某些操作

(2):在onStop方法中,取消注册(目的是节约资源)

unregisterReceiver(接受者对象);

(3):在广播的接受者中通过比对发送者发送的系统广播,来完成某些操作(见例子)

3:具体实现

(1)主Activity中通过动态注册的方式完成系统广播的发送与接受

public class MainActivity extends Activity {

private TextView tv;//声明控件

//广播接收者对象

private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

//通过匹配是不是电池电量变化系统广播,而完成操作

//intent.getAction()获得是发送过来的广播

if(intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){

//电池电量当前值,单位为百分比,其中键值level为系统固定

int level = intent.getIntExtra("level", 0);

//电池电量总值,其中键值scale为系统固定

int scale = intent.getIntExtra("scale", 100);

//在主Activity中的TextView控件中显示当前电量的百分比

tv.setText(level*100/scale+"%");

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tv = (TextView) findViewById(R.id.tv);

//动态注册

registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

}

@Override

protected void onStop() {

super.onStop();

//取消注册,节约资源

unregisterReceiver(receiver);

}

}

(2)结果

a5b52d5afab057a964ec8e055d903a63.png

广播,Activity,Service之间可以相互的作用,从而达到某些我们意向的效果。他们之间的组合作用,见下一篇博文咯。。。。72ff99c9ea500e990b96a2de9610edd0.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值