Android BroadcastReceiver学习总结

                                  小丸子在这里祝愿大家愚人节快乐!记得不要被坑的说。。。。。。

这次的 BroadcastReceiver 的学习也是在慕课网上,在此感谢慕课网为我们提供这样一个免费的学习平台。

BroadcastReceiver

1.Broadcast

既然我们要学习广播接收器,那么我们首先要知道广播为何物,Broadcast,广播就是一种能在应用之间传输信息的机制,说白了就是传送消息。

1.1Broadcast的分类

     1.1.1普通广播(Normal Broadcast)

             所有监听该广播的广播接收者都可以监听到该广播

             特点:

                      同级别接收先后是随机的(无序的)

                      级别低的后接收到广播

                      接收器不能截断广播的继续传播也不能对广播进行处理

                      同级别的动态注册高于静态注册(这里不懂没关系在下面会有介绍,请耐心往下看)

     1.1.2有序广播(Ordered Broadcast)

             按照接收者的优先级别顺序进行接收广播,优先级别在<intent-filter>的priority中声明,级别的范围在 -1000 - 1000 之间,值越大,级别就越高,还可以对广播进行终止,不让意图继续传播,接收者可以篡改内容。

             特点:

                      同级别接收先后是随机的

                      能截断广播的继续传播,高级别的广播接收器手动改广播后,可以决定把该广播是否截断

                      接收器能截断广播也能处理广播,同时将处理后的广播继续发送

                      同级别动态注册高于静态注册

     1.1.3异步广播(粘滞性滞留广播)

             不能将结果传给下一个广播接收器,无法对广播进行终止。 

             特点:

                      可以先发送广播,再注册广播接收器         

2.BroadcastReceiver

广播接收器,官方说法就是对发送出来的广播进行过滤并且进行接收响应的一类组件,其实就是用来接收系统以及应用的广播。

2.1注意事项

     2.1.1 BroadcastReceiver同Activity,Service,ContentProvider一样需要注册,有静态注册和动态注册两种。

     2.1.2 BroadcastReceiver的生命周期只有10s左右,5s左右的时候也会报ANR,再过一点时间就会直接崩溃。

     2.1.3 BroadcastReceiver里面不能做一些耗时的操作。

     2.1.4 耗时操作可通过Intent发送给Service由它来完成。

     2.1.5 BroadcastReceiver不能使用子线程,因为它生命周期短,一旦被销毁,子线程也会被kill。

     2.1.6 如果动态注册,一定要在合适的位置unRegisterReceiver。

3.举例

如果手机开机,那么系统就会发送一条开机的广播;

如果网络状态改变,那么系统就会发送一条关于网络状态改变的广播等等。。。。。。

如果还不是很清楚的话,没关系,接下来会通过一个小demo跟大家一起来进行学习。

----------------------------------------------------重点来啦----------------------------------------------------我们来写代码啦---------------------------------------

首先我来介绍一下基本的用法:

发送:把信息装入一个Intent的实例对象,例如Action,通过调用相应的方法将Intent对象以广播的方式发送出去,方法如下:

           sendBroadcast()

           sendOrderBroadcast()

           sendStickyBroadcast()

           显而易见,这三种发送方法对应的就是三种广播。

接收:当Intent发送出去之后呢,所有已经进行注册的广播接收器都会检查注册时候的<IntentFilter>是否与所检查到的广播Intent相匹配,匹配的话就会调用广播接收器的onReceive()方法,所以当我们写一个BroadcasrReceiver的子类的时候记得实现这个方法。

首先我们来实现布局,一共由三个按钮组成:

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <Button
            android:id="@+id/btn_send_normal"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="@string/send_normal"
            android:layout_weight="1"/>

    <Button
            android:id="@+id/btn_send_order"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="@string/send_order"
            android:layout_weight="1"/>

    <Button
            android:id="@+id/btn_send_other"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="@string/send_other"
            android:layout_weight="1"/>
    
</LinearLayout></span>

效果图是这样滴:

                                                              

接下来我们来回到我们的Activity:

<span style="font-size:14px;">public class BroadcastReceiverTestActivity extends Activity implements View.OnClickListener {
    private BroadcastReceiverChild3 bc3 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_provider);

        findViewById(R.id.btn_send_normal).setOnClickListener(this);
        findViewById(R.id.btn_send_order).setOnClickListener(this);
        findViewById(R.id.btn_send_other).setOnClickListener(this);

/*      IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity");
        BroadcastReceiverChild2 brc2 = new BroadcastReceiverChild2();
        registerReceiver(brc2, intentFilter);*/
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send_normal:
                Intent intent = new Intent();
                intent.putExtra("BroadcastReceiverTestActivity", "我是广播君,么么哒~");
                intent.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity");
                sendBroadcast(intent);
                break;
            case R.id.btn_send_order:
                Intent intent1 = new Intent();
                intent1.putExtra("BroadcastReceiverTestActivity", "我是有序的广播君,么么哒~");
                intent1.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity");
                sendOrderedBroadcast(intent1,null);
                break;
            case R.id.btn_send_other:
                Intent intent2 = new Intent();
                intent2.putExtra("BroadcastReceiverTestActivity", "我是吊炸天的异步的广播君,么么哒~");
                intent2.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
                sendStickyBroadcast(intent2);

                IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
                bc3 = new BroadcastReceiverChild3();
                registerReceiver(bc3, intentFilter);
                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(bc3);
    }
}
</span>

在这里,我来说一下,动态注册与静态注册的问题。

动态注册:

<span style="font-size:14px;">                IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
                bc3 = new BroadcastReceiverChild3();
                registerReceiver(bc3, intentFilter);</span>

这样就实现了动态注册,大家也可以在代码中的onDestroy()看到我在这里将动态注册的广播接收器给取消注册啦。

静态注册:

在AndroidManifest.xml里面进行注册

<span style="font-size:14px;">        <receiver
                android:name=".BroadcastReceiverChild2">
            <intent-filter>
                <action android:name="com.glimmer.myapplication.BroadcastReceiverTestActivity"/>
            </intent-filter>
        </receiver></span>
只有Intent的Action与广播接收器的Action一样的时候才能被接收到哦~

下面贴一下BroadcastReceiver的代码:

<span style="font-size:14px;">public class BroadcastReceiverChild extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
        //abortBroadcast();
        Bundle bundle = new Bundle();
        bundle.putString("BC1","我是有序广播可以传消息哦~");
        setResultExtras(bundle);
    }
}</span>
那个abortBroadcast()是用来截断广播的哦~~大家去修改一下优先级,试试

优先级这么写哈:

<span style="font-size:14px;">       <receiver
                android:name=".BroadcastReceiverChild">
            <intent-filter
                    android:priority="100">
                <action android:name="com.glimmer.myapplication.BroadcastReceiverTestActivity"/>
            </intent-filter>
        </receiver>
</span>

<span style="font-size:14px;">public class BroadcastReceiverChild2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
        Toast.makeText(context, msg+"2", Toast.LENGTH_SHORT).show();
        Bundle bundle = getResultExtras(true);
        String msg2 = bundle.getString("BC1");
        Toast.makeText(context, msg2, Toast.LENGTH_SHORT).show();

    }
}</span>

<span style="font-size:14px;">public class BroadcastReceiverChild3 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
        Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
    }
}
</span>

不知道大家看懂了没~END

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值