【总结】BroadCast Recevier 的使用


1.广播的分类

1.普通广播:普通广播相互都是异步的,相互之间没有任何干扰。每个接受者不需要等待就可以收到广播,并且它们之间没有办法终止广播,即,无法终止其他接受者的接受动作。

定义3个广播:

public class FirstRecevier extends BroadcastReceiver{

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag,"FirstReceiver:  "+msg);

        //普通广播不能终止广播
        //abortBroadcast();
    }
}

public class SecendRecevier extends BroadcastReceiver{

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag, "SecendRecevier:  " + msg);
    }
}

public class ThreeRecevier extends BroadcastReceiver{

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag, "ThreeRecevier:  " + msg);
    }
}

以上3个广播皆可以收到消息;

如果在第一个广播的onReceive()方法中加入abortBroadCast()终止广播方法。

测试之后发现其他2个广播任然可以进行接收动作。所以得出结论,普通广播,无法终止广播。


2.有序广播:有序广播的传递机制,优先级最高的广播首先得到消息,然后经由这个广播,将消息传递到下一个优先级的广播中。优先级最高的广播有能力终止广播。

优先级为1000的广播:

public class FirstRecevier extends BroadcastReceiver{

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i(Tag,"FirstReceiver:  "+msg);

        //普通广播不能终止广播
        //abortBroadcast();

        //有序广播实验
        Bundle bundle = new Bundle();
        bundle.putString("msg", msg + "@FirstRecevier");
        setResultExtras(bundle);

    }
}

它对应的静态注册:

<receiver android:name=".FirstRecevier">
     <intent-filter android:priority="1000">
          <action android:name="android.intent.action.MY_BROADCAST"/>
          <category android:name="android.intent.category.DEFAULT"/>
     </intent-filter>
</receiver>

优先级为999的广播:

public class SecendRecevier extends BroadcastReceiver {

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = getResultExtras(true).getString("msg");
        Log.i(Tag, "SecendRecevier:  " + msg);

        Bundle bundle = new Bundle();
        bundle.putString("msg",msg + "@SecendReceiver");
        setResultExtras(bundle);
    }
}

它对应的静态注册:

        <receiver android:name=".SecendRecevier">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.MY_BROADCAST"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

优先级最低的广播:

public class ThreeRecevier extends BroadcastReceiver{

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = getResultExtras(true).getString("msg");
        Log.i(Tag, "ThreeRecevier:  " + msg);
    }
}

它对应的静态注册:

        <receiver android:name=".ThreeRecevier">
            <intent-filter android:priority="998">
                <action android:name="android.intent.action.MY_BROADCAST"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

其中:setResultExtras()为,将它的结果封装为一个结果集,并传递打下一个优先级的广播中。
所以,在下一个广播中我们需要使用:getResultExtras(true).get()来获取消息。

使用有序广播:

        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg","my world");
        sendOrderedBroadcast(intent,"wangpei.permission.MY_BROADCAST_PERMISSION");

其中的

wangpei.permission.MY_BROADCAST_PERMISSION

为自定义的权限,即:

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

使用该权限:

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


最后打印如下:


2.系统的广播


1.实现手机开机时的广播。

首先需要创建一个Recevier。

public class MyBootComplete extends BroadcastReceiver{

    private static final String TAG = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context,MyService.class);
        context.startService(service);
        Log.i(TAG,"the Boot has Start!");
    }
}

在AndroidMainfest中注册,开机广播:

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

而且需要注册Service(因为我们模拟的是开机时,启动一个Service),然后需要提醒用户要获取的权限:

<service android:name=".MyService"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

以上,编写完成后,重启模拟器,便可以看到以下的Log信息:

07-22 07:44:02.328      741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ the Boot has Start!
07-22 07:44:02.332      741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ Service is Start!
07-22 07:44:02.332      741-741/com.app.wangpei.wangpeiapp I/MyInfo﹕ onStartCommand is start!


3.总结


1.使用广播的大体步骤:


1.首先,创建一个类去继承BroadCast Recevier这个类。

2.然后,在重写的方法onRecive()中去编写当广播发起时们需要进行的程序逻辑。

public class SecendRecevier extends BroadcastReceiver {

    private static final String Tag = "MyInfo";

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = getResultExtras(true).getString("msg");
        Log.i(Tag, "SecendRecevier:  " + msg);

        Bundle bundle = new Bundle();
        bundle.putString("msg",msg + "@SecendReceiver");
        setResultExtras(bundle);
    }
}

3.注册,有2中方法
1.静态方法:在AndroidMainfest中去注册

        <!-- 系统开机广播 -->
        <receiver android:name=".boot.MyBootComplete">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

注意:需要权限时,或者需要通知用户时,必须要加上需要使用的权限信息。

2.动态方法:在Activity中去用代码注册

//        broadCast = new MyBroadCast();
//        IntentFilter filter = new IntentFilter();
//        filter.addAction("android.intent.action.MY_BROADCAST");
//        registerReceiver(broadCast,filter);

以上2中方法皆可以达到使用广播的目的, 但是是有所不同的:具体是,静态注册的广播只要一开机,便一直处于在监听的状态中,不会受到当前应用的影响。而动态的注册则是根据当前的Activity来决定其状态。
所以在动态注册的时候,假如你没有在Activity撤销的时候调用

//        unregisterReceiver(broadCast);

则,系统会抛出一个异常,所以我们需要这样来解决:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadCast);
    }

4.使用(假如是点击事件的话,则这样使用)

    public void send(View view) {
        //普通广播
       Intent intent = new Intent("android.intent.action.MY_BROADCAST");
       intent.putExtra("msg","hello Recevier!");
       sendBroadcast(intent);

        //有序广播
        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg","my world");
        sendOrderedBroadcast(intent,"wangpei.permission.MY_BROADCAST_PERMISSION");
    }




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值