一个简单的Android BroadcastReceiver 广播实例

来源:互联网 发布:知轩藏书 编辑:程序博客网 时间:2024/05/21 11:29

今天记录一下Android四大组件当中的BroadcastReceiver,也就是广播、广播接收者。

先说一说BroadcastReceiver的生命周期,它的生命周期相当短暂,只有十秒左右,同时咱们新建一个广播,就会发现仅仅只有public void onReceive(Context context, Intent intent){}这一个方法,所以一点注意事项,onReceive()方法执行时不能超过10秒。

直接说怎么使用,首先肯定是创建一个广播接收者类,该类集成BroadcastReceiver,重新onReceive()方法,同时在AndroidManifest.xml配置该广播接收者,注:这都不是重点,因为使用Android studio,只要我们选择new 一个 BroadcastReceiver,这些东西就都有了。

接下来就是第一个重点:

注册该广播接收者,注册方式有两种,一种是静态注册,另一种是动态注册,两种注册方式使用任意一种就行,建议使用静态注册,首先简单,其次,静态注册的广播接收者,即使activity没有启动,该广播接收者也存在,但是动态注册的方式,activity不在激活状态时,对应注册的广播接收者也不存在。

首先来说静态注册,还是类似于之前对activity设置动作一样的,就是给action 设置name属性,方式如下:

        <receiver            android:name=".MyReceiver">            <intent-filter>                <action android:name="com.test.jh" />            </intent-filter>        </receiver>

接下来说动态注册,动态注册也很简单,Activity中使用registerReceiver()方法,代码如下:

       //动态注册广播        MyReceiver myReceiver = new MyReceiver();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com.test.jh");        registerReceiver(myReceiver,intentFilter);
到此我们学会了如何注册去注册一个广播接收者,也知道接收到广播之后只需要在onReceive()方法中进行处理,那么如何发出一个广播呢?也很简单,看代码:

        //1.新建一个intent,然后设置Action        //2.sendBroadcast(intent)        Intent intent = new Intent();        intent.setAction("com.test.jh");            //对应广播接收者注册的动作        intent.putExtra("data","MainActivity");     //可以传递参数,非必须        sendBroadcast(intent);

现在一个最简单的广播基本就完成了,只需要在onReceive()方法中执行一定操作,该广播就成功了,这里的onReceive()方法:
    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "我在此处接收到广播,接收到的data为:"+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();    }
我在MainActivity中定义了一个按钮,作用是用来发出广播,现在来看看运行效果:

运行效果,可以看出,当点击了按钮,发出广播时,onReceive()执行了,接收到我发出的广播,并且接收到了传递的参数。

普通广播与有序广播:

普通广播跟有序广播的使用区别在于:

  普通广播发出后,所有广播接收者同时接受广播,相互之间无交涉;

  有序广播发出后,按照广播接收者的级别高低,依次接收广播(高级别先接收,低级别后接收),级别范围为(-1000 ~ 1000),高级别可以给广播添加参数,低级别也可以接收到高级别添加的参数。同时高级别还有权限中断该广播,中断后低级别无法接收到广播。

发送普通广播跟有序广播的区别在于:

                sendBroadcast(intent);      //发送普通广播                sendOrderedBroadcast(intent,null);  //发送有序广播,参数较多,最少需要两个,后一个参数为接受权限,此处没设置,故为null

前面说了,有序广播会根据广播接收者的级别高低来先后接受广播,所以需要设置级别:

静态设置方式 android:priority="999"

        <receiver android:name=".MyReceiver" >            <intent-filter android:priority="999">                <action android:name="com.test.jh" />            </intent-filter>        </receiver>

动态设置方式 intentFilter.setPriority(999):

        //动态注册广播        MyReceiver myReceiver = new MyReceiver();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com.test.jh");        intentFilter.setPriority(999);          //设置有序广播级别        registerReceiver(myReceiver,intentFilter);

案例中创建两个有序广播,高级别先接收,低级别后接收,这里不再展示运行效果。

之前说过高级别广播接收者可以中断广播,只需调用abortBroadcast(),方法即可。

    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "我在MySecondReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();        abortBroadcast();    //该方法可以中断广播,低级别的广播接收者将不能接收到广播。    }
再看看高级别的接收者给广播添加参数,然后在低级别的接收者中接到参数:

先看看两个接收者界别高低:

<receiver android:name=".MyReceiver" >            <intent-filter android:priority="-999">                <action android:name="com.test.jh" />            </intent-filter>        </receiver>        <receiver            android:name=".MySecondReceiver">            <intent-filter android:priority="990">                <action android:name="com.test.jh" />            </intent-filter>        </receiver>
然后看看MySecondReceiver:

public class MySecondReceiver extends BroadcastReceiver {    public MySecondReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "我在MySecondReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();        Log.i("debug", "MySecondReceiver: 接收到的data为:" + intent.getStringExtra("data"));        //        abortBroadcast();    //该方法可以中断广播,低级别的广播接收者将不能接收到广播。        //给广播添加参数        Bundle bundle = new Bundle();        bundle.putString("msg","我是MySecondReceiver,很显然我的级别比你高啊");        setResultExtras(bundle);    }}
然后看看MyReceiver:
public class MyReceiver extends BroadcastReceiver {    public MyReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "我在MyReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();        Log.i("debug", "MyReceiver: 接收到的data为:" + intent.getStringExtra("data"));        //获取高级别传递的参数        String msg =  getResultExtras(true).getString("msg");        Toast.makeText(context,"接收到的参数为:"+msg,Toast.LENGTH_SHORT).show();        Log.i("debug", "MyReceiver: msg:" + msg);    }}
最后看看运行效果,我们可以看出MySecondReceiver级别高,所以先接收到广播,之后它在广播中添加了参数,MyReceiver级别低,后接受到广播,同时它也接收到了MySecondReceiver传递过来的参数:


0 0
原创粉丝点击