美文网首页
第二卷 Broadcast Receiver

第二卷 Broadcast Receiver

作者: Android师哥 | 来源:发表于2019-01-12 17:31 被阅读5次
NightRain.png

2.1全局广播

2.1.1广播类型

  • 标准广播

    是一种异步广播,在广播发出后,所有的广播接收器几乎在同一时刻接收到这条消息。因此,标准广播没有任何的先后顺序可言。相对来说,这种广播的接收效率会高一些。

  • 有序广播

    是一种同步广播,在广播发出后,同一时刻只有一个广播接收器可以接收这条消息,当这个接收器处理完逻辑任务后,广播才会继续向下传递。因此,有序广播的的接收器有先后顺序,优先级高的广播接收器就会优先接收到消息,并且有截断广播的权力。

2.1.2广播注册方式

  • 动态注册

    广播接收器可以自由的控制注册和注销,在灵活方面有着很大的优势,但是有一个很大的缺点是必须在执行了注册代码后发送广播,这个接收器才会接收到!

  • 静态注册

    静态注册相对于动态注册,灵活性降低了许多,因为是在AndroidManifest文件中进行注册,是一个无法注销的广播。

2.1.3发送标准广播

  • 准备广播接收器(为了测试,准备两个接收器)
private class MBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //逻辑代码
        Toast.makeText(MainActivity.this, "动态注册", Toast.LENGTH_LONG).show();
    }
}
public class StaticReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //逻辑代码
        Toast.makeText(context, "静态注册", Toast.LENGTH_SHORT).show();
    }
}
  • 注册广播(两个接收器两种注册方式)

动态注册

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMBroadcastReceiver = new MBroadcastReceiver();
    IntentFilter mIntentFilter = new IntentFilter();
    mIntentFilter.addAction("com.nightrain.broadcastreceiverdemo.standard");
    registerReceiver(mMBroadcastReceiver, mIntentFilter);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMBroadcastReceiver != null) {
        //动态注册记得注销
        unregisterReceiver(mMBroadcastReceiver);
    }
}

静态注册

在AndroidManifest文件中注册

<receiver
    android:name=".StaticReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter>
            <action android:name="com.nightrain.broadcastreceiverdemo.standard">
        </intent-filter>
</receiver>
  • 发送标准广播
Intent mIntent = new Intent();
mIntent.setAction("com.nightrain.broadcastreceiverdemo.standard");
mIntent.setPackage(getPackageName());
sendBroadcast(mIntent);

2.1.4发送有序广播

  • 准备广播接收器(同样两个接收器,这次在静态接收器中设置一个拦截器)
private class MBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //逻辑代码
        Toast.makeText(MainActivity.this, "动态注册", Toast.LENGTH_LONG).show();
    }
}
public class StaticReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //逻辑代码
        Toast.makeText(context, "静态注册", Toast.LENGTH_SHORT).show();
        //拦截广播
        abortBroadcast();
    }
}
  • 注册广播(两个接收器两种注册方式)

动态注册

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMBroadcastReceiver = new MBroadcastReceiver();
    IntentFilter mIntentFilter = new IntentFilter();
    mIntentFilter.addAction("com.nightrain.broadcastreceiverdemo.standard");
    registerReceiver(mMBroadcastReceiver, mIntentFilter);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMBroadcastReceiver != null) {
        //动态注册记得注销
        unregisterReceiver(mMBroadcastReceiver);
    }
}

静态注册

在AndroidManifest文件中注册(这次在静态广播中添加优先级)

<receiver
    android:name=".StaticReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter android:priority="100">
            <action android:name="com.nightrain.broadcastreceiverdemo.standard">
        </intent-filter>
</receiver>
  • 发送有序广播
Intent mIntent = new Intent();
mIntent.setAction("com.nightrain.broadcastreceiverdemo.standard");
mIntent.setPackage(getPackageName());
sendOrderedBroadcast(mIntent, null);

2.2本地广播

  • 创建接收器
private class MLocalBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //逻辑代码
        Toast.makeText(MainActivity.this, "本地广播", Toast.LENGTH_LONG).show();
    }
}
  • 注册广播
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //获取本地广播管理器
    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    mMLocalBroadcastReceiver = new MLocalBroadcastReceiver();
    IntentFilter mLocalIntentFilter = new IntentFilter();
    mLocalIntentFilter.addAction("com.nightrain.broadcastreceiverdemo.local");
    //注册广播
    mLocalBroadcastManager.registerReceiver(mMLocalBroadcastReceiver, mLocalIntentFilter);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mLocalBroadcastManager != null && mMLocalBroadcastReceiver != null) {
        //注销广播
        mLocalBroadcastManager.unregisterReceiver(mMLocalBroadcastReceiver);
    }
}
  • 发送广播
Intent mIntent = new Intent();
mIntent.setAction("com.nightrain.broadcastreceiverdemo.local");
mLocalBroadcastManager.sendBroadcast(mIntent);

2.3结语

  • 全局广播

    1、多种发送方式,使用灵活

    2、可以跨程序接收消息(也就意味着数据不安全)

    3、由于系统限制,API 26以上的静态广播需要指定包名才可接收到消息

  • 本地广播

    1、应用内部使用的广播,只有应用内部才可以接收消息,不必担心数据的安全性

    2、本地广播比全局广播的效率更高

相关文章

  • 第二卷 Broadcast Receiver

    2.1全局广播 2.1.1广播类型 标准广播是一种异步广播,在广播发出后,所有的广播接收器几乎在同一时刻接收到这条...

  • Android BroadcastReceiver详解

    Broadcast Receiver是什么 Broadcast Receiver是四大组件之一,是一种广泛运用在应...

  • Activity之生命周期

    Android四大组件有Activity,Service,Broadcast Receiver,Broadcast...

  • Broadcast Receiver

    一、广播 1.广播定义 Broadcast Receiver是一种广泛运用的在程序之间传输信息的机制,androi...

  • Broadcast Receiver

    广播的定义 四大组件之一,是安卓应用程序之间传递信息的机制。我们要发送的广播内容是一个Intent,这个Inten...

  • Broadcast Receiver

    广播广泛运用于应用程序之间传输信息(进程间通信)的机制,而BroadcastReceiver是对发送出来的广播进行...

  • Broadcast Receiver

    一.广播 1.在Android中,Broadcast在应用程序之间传输信息的机制,我们发送的广播内容是一个Inte...

  • Broadcast Receiver

    广播的两种类型 标准广播(Normal broadcasts) : 是一种完全异步执行的广播,在广播发出后,所有...

  • Broadcast Receiver

    1.请描述一下 BroadcastReceiver(★★) BroadCastReceiver 是 Android...

  • Broadcast Receiver

    1.系统广播 答:就是手机中自带的广播,例如 手机快没电了、拍照、屏幕的开关等等手机系统发出的广播,根据特定的指令...

网友评论

      本文标题:第二卷 Broadcast Receiver

      本文链接:https://www.haomeiwen.com/subject/reucdqtx.html