Android BroadcastReceiver

一 BroadcastReceiver简介

BroadcastReceiver是四大组件之一 用来完成组件之间或者应用之间的通讯

Broadcast: 广播

BroadcastReceiver: 广播接收者

广播和广播接收者完成一个消息机制 属于重量级别 因为需要激活组件

 

二 注意

在Android中 每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法

onReceive()方法执行完后 BroadcastReceiver的实例就会被销毁

onReceive()方法也是在主线程调用

onReceive()方法在10s内没有执行完毕 就会导致一个异常 ANR(application not response)

所以在BroadcastReceiver里不能做一些比较耗时的操作

如果需要完成一项比较耗时的操作 应该通过发送Intent给Service 由Service来完成 这里不能使用子线程来解决

因为BroadcastReceiver的生命周期很短 子线程可能还没有结束BroadcastReceiver就先结束了

BroadcastReceiver一旦结束 此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死

因为它属于空进程(没有任何活动组件的进程) 如果它的宿主进程被杀死 那么正在工作的子线程也会被杀死 所以采用子线程来解决是不可靠的

 

三 无序广播

没有接收的先后顺序 所有的广播接收者同时接收

// 广播接收者
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 当广播接收者接收到广播 该方法会被调用
        if ("com.hy.mm.action.TEST".equals(intent.getAction())) {
            String name = intent.getStringExtra("name");
            Log.i("HUANG", "name=" + name);
        }
    }

}
// 第一种订阅广播方式 AndroidManifest.xml application节点里面配置receiver
<receiver android:name=".receiver.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.hy.mm.action.TEST" />
    </intent-filter>
</receiver>
// 第二种订阅广播方式
public class MainActivity extends AppCompatActivity {

    MyBroadcastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 订阅广播
        mReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter("com.hy.mm.action.TEST");
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消订阅
        unregisterReceiver(mReceiver);
    }

}
// 发送无序广播
Intent intent = new Intent("com.hy.mm.action.TEST");
intent.putExtra("name", "小白");
sendBroadcast(intent);

 

四 有序广播

有接收的先后顺序 是由广播接收者自己指定 取值范围(-1000 ~ 1000)

如果先接收的广播接收者中断广播 那么后面的广播接收者就无法接收了

特殊情况: 如果有序广播在发出的时候明确的指定了广播接收者 那么这样的广播无法中断 一定会发送给指定的接收者

// 广播接收者1
public class MyBroadcastReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 当广播接收者接收到广播 该方法会被调用
        if ("com.hy.mm.action.T".equals(intent.getAction())) {
            int age = intent.getIntExtra("age", 0);
            Log.i("HUANG", "MyBroadcastReceiver1 age=" + age);
        }
    }

}
// 广播接收者2
public class MyBroadcastReceiver2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 当广播接收者接收到广播 该方法会被调用
        if ("com.hy.mm.action.T".equals(intent.getAction())) {
            int age = intent.getIntExtra("age", 0);
            Log.i("HUANG", "MyBroadcastReceiver2 age=" + age);
            // 中断广播
            //abortBroadcast();
        }
    }

}
// 订阅广播 AndroidManifest.xml application节点里面配置receiver
<!-- priority: 优先级(-1000 ~ 1000) 值越大优先级越高 -->
<receiver android:name=".receiver.MyBroadcastReceiver1">
    <intent-filter android:priority="900">
        <action android:name="com.hy.mm.action.T" />
    </intent-filter>
</receiver>

<receiver android:name=".receiver.MyBroadcastReceiver2">
    <intent-filter android:priority="1000">
        <action android:name="com.hy.mm.action.T" />
    </intent-filter>
</receiver>
// 发送有序广播
Intent intent = new Intent("com.hy.mm.action.T");
intent.putExtra("age", 15);
sendOrderedBroadcast(intent, null);

 

posted @ 2018-08-31 09:28  梦三  阅读(2394)  评论(0编辑  收藏  举报