Android 广播接收器 BroadcastReceiver 注册、注销、优先级、拦截

来源:互联网 发布:java 接收post文件 编辑:程序博客网 时间:2024/06/16 18:03


BroadcastReceiver也就是广播接收者的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:

BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。

 

创建一个新工程LearnBroadcastReceiver,一个空Activity

广播接收器MyReceiver

用于显示Intent调用

 

MyReceiver1

隐式Intent

拦截广播

MyReceiver2

隐式Intent

实现主动注册也注销,拦截广播

创建一个MyReceiver, MyReceiver1, MyReceiver2 广播接收类扩展至
 
public class MyReceiver extends BroadcastReceiver {    public MyReceiver() {    }      @Override    public void onReceive(Context context, Intent intent) {        System.out.println("0个广播接收器接收到消息是:====="+intent.getStringExtra("data"));      }}

 

public class MyReceiver1 extends BroadcastReceiver {    public MyReceiver1() {    }      @Override    public void onReceive(Context context, Intent intent) {        System.out.println("1个广播接收器接收到消息是:"+intent.getStringExtra("data"));        if (intent.getStringExtra("isLanJie").equals("TRUE")) {            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息        }          }}

 

public class MyReceiver2 extends BroadcastReceiver {    public static final String ACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2";    public MyReceiver2() {      }      @Override    public void onReceive(Context context, Intent intent) {        System.out.println("2个广播接收器接收到消息是:" + intent.getStringExtra("data"));        if (intent.getStringExtra("isLanJie").equals("TRUE")){            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息          }      }}

 

修改androidManifest.xml中广播接收器

<receiver    android:name=".MyReceiver"    android:enabled="true"    android:exported="true" >  </receiver>    <!--<receiver android:name=".MyReceiver2" >-->    <!--<intent-filter>-->        <!--<action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />-->    <!--</intent-filter>--><!--</receiver>-->    <receiver    android:name=".MyReceiver1"    android:enabled="true"    android:exported="true" >    <intent-filter android:priority="1">        <action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />    </intent-filter></receiver>

 

 

在创建完我们的MyReceiver2之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    Button bSend;    private  MyReceiver2 myReceiver2=null;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);          bSend=(Button) findViewById(R.id.btnSendMsg);        bSend.setOnClickListener(this);        findViewById(R.id.btnReg).setOnClickListener(this);        findViewById(R.id.btnUnReg).setOnClickListener(this);        findViewById(R.id.btnsendYinShi).setOnClickListener(this);    }      @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.btnSendMsg:                //发送消息                Intent intent=new Intent(this,MyReceiver.class);                intent.putExtra("data", "消息来自czg");                sendBroadcast(intent);                break;              case R.id.btnsendYinShi:                //没有自动注册的广播接收器自能用隐式的Intent进行创建(没有告诉要发送给哪个接收器,所有的接收器都可以接受到,优先级比较高的接收器可以根据需要拦截后面接收的的接收)                Intent intent2=new Intent(MyReceiver2.ACTION);                intent2.putExtra("data","消息来自czg");                CheckBox cb= (CheckBox) findViewById(R.id.checkBox);                if (cb.isChecked()==true){                    intent2.putExtra("isLanJie","TRUE");                }else {                    intent2.putExtra("isLanJie","FALSE");                }                  //sendBroadcast(intent2);                sendOrderedBroadcast(intent2, null); //发送可以被拦截的广播,第二个参数可以指定权限                break;            case R.id.btnReg:  //注册                if (myReceiver2==null){                    myReceiver2=new MyReceiver2();                    registerReceiver(myReceiver2,new IntentFilter(MyReceiver2.ACTION));                  }                break;            case R.id.btnUnReg:  //注销                if (myReceiver2!=null){                    unregisterReceiver(myReceiver2);                    myReceiver2=null;                  }                break;        }    }}

 

 

0 0