基础-4 ANDROID BroadcastReceiver

来源:互联网 发布:sql having where同时 编辑:程序博客网 时间:2024/05/22 03:53

BroadcastReceiver也就是“广播接收者”,它就是用来接收来自系统和应用中的广播。
定义广播接收者的地址,就可以通过地址将广播放送出去到接收者。
自定义一个BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {    private static final String TAG = "MyReceiver";    @Override    public void onReceive(Context context, Intent intent) {        String data = intent.getStringExtra("data");        Log.i(TAG, data);    }}

广播分静态注册,动态注册
1.静态注册:在AndroidManifest.xml文件中配置

 <receiver android:name=".MyReceiver">     <intent-filter>                <action android:name="android.intent.action.MyReceiver"></action>         <category android:name="android.intent.category.DEFAULT" />     </intent-filter> </receiver>

这种注册是永久的,当广播信息发送来时,应用是关闭状态也会也会调用到该广播接收者。
2.动态注册 通过代码注册,生命周期跟随应用的生命周期。

MyReceiver m= new MyReceiver();IntentFilter ifm = new IntentFilter();ifm.addAction("android.intent.action.MY_RECEIVER");registerReceiver(m,ifm);

在应用关闭是应用解除注册的广播地址,不然会出现异常

unregisterReceiver(m); 

广播接收者信息设置完了,我们就可以发送广播了:

 Intent i = new Intent("android.intent.action.MyReceiver"); i.putExtra("data", "广播信息"); sendBroadcast(i);

运行后:

12-12 16:42:23.378 27877-27877/com.cn.broadcastreceiver I/MyReceiver: 广播信息

可以给多个广播接收者注册相同的地址,每个广播接收者都可以收到消息,且互不影响,这种为普通广播,还有一种为有序广播,通过设置优先级来传播。
普通广播:

        MyReceiver m= new MyReceiver();        IntentFilter ifm = new IntentFilter();        ifm.addAction("android.intent.action.MY_RECEIVER");        registerReceiver(m,ifm);        TReceiver t= new TReceiver();        IntentFilter ift = new IntentFilter();        ift.addAction("android.intent.action.MY_RECEIVER");        registerReceiver(t,ift);
12-12 16:55:31.646 4031-4031/com.cn.broadcastreceiver I/MyReceiver: 广播信息12-12 16:55:31.646 4031-4031/com.cn.broadcastreceiver I/TReceiver: 广播信息

有序广播:
在AndroidManifest.xml文件中配置

<receiver android:name=".MyReceiver" **android:priority="1000"**></receiver>        <receiver android:name=".TReceiver" **android:priority="999"**></receiver>

android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。

MyReceiver m= new MyReceiver();IntentFilter ifm = new IntentFilter();ifm.addAction("android.intent.action.MY_RECEIVER");registerReceiver(m,ifm);TReceiver t= new TReceiver();IntentFilter ift = new IntentFilter();ift.addAction("android.intent.action.MY_RECEIVER");registerReceiver(t,ift);Intent i = new Intent("android.intent.action.MY_RECEIVER");i.putExtra("data", "广播信息");        sendOrderedBroadcast(i,"scott.permission.MY_BROADCAST_PERMISSION");

使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
在AndroidMainfest.xml中定义一个权限:

 <permission android:protectionLevel="normal" android:name="scott.permission.MY_BROADCAST_PERMISSION"></permission>

使用该权限:

<uses-permission android:name="scott.permission.MY_BROADCAST_PERMISSION"></uses-permission>

在MyReceiver停止该广播,TReceiver接收不到了。

public class MyReceiver extends BroadcastReceiver {    private static final String TAG = "MyReceiver";    @Override    public void onReceive(Context context, Intent intent) {        String data = intent.getStringExtra("data");        Log.i(TAG, data);        //停止该广播        abortBroadcast();    }}
12-12 17:04:12.701 11539-11539/com.cn.broadcastreceiver I/MyReceiver: 广播信息
0 0
原创粉丝点击