Android BroadcastReceiver

一 BroadcastReceiver简介android

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

Broadcast: 广播ide

BroadcastReceiver: 广播接收者spa

广播和广播接收者完成一个消息机制 属于重量级别 由于须要激活组件线程

 

二 注意code

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

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

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);
相关文章
相关标签/搜索