概述
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)结果
广播,Activity,Service之间可以相互的作用,从而达到某些我们意向的效果。他们之间的组合作用,见下一篇博文咯。。。。
最后
以上就是糊涂玉米为你收集整理的android 广播原理,Android广播的全部内容,希望文章能够帮你解决android 广播原理,Android广播所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复