自学内容网 自学内容网

Android --- 广播

广播是什么?

一种相互通信,传递信息的机制,组件内、进程间(App之间)

如何使用广播?

组成部分

发送者-发送广播

与启动其他四大组件一样,广播发送也是使用intent发送。

  • 设置action:表示这个广播可以被哪些接收器接收到
  • 通过 putExtra,传递额外的bundle信息
 Intent intent = new Intent();
 intent.setAction(SEND_STATIC_ACTION);
 intent.putExtra("data","静态广播");
 sendBroadcast(intent);

接收者-广播接收

创建广播接收器

继承 BroadcastReceiver 类

或直接new该类的对象实例,然后重写方法 onReceive,在该方法中处理接收到的广播消息。

注册广播接收器

注册广播接收器有两种办法,静态注册和动态注册,可以分为两种广播

  • 静态广播:常驻内存中,是在Manifest文件中注册的,可在App未启动时就监听广播
  • 动态广播:App启动后注册,是在代码中注册以及解除注册的广播,解除注册后,广播也随时结束。

同时注册时,动态优于静态

静态广播

创建广播接收器类

// 静态广播接收器
public class StaticBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Log.d("BroadcastReceiver","静态广播接收器接受了一个 - "+bundle.getString("data"));
    }
}

在 Manifest文件中注册广播接收器

   <receiver android:name=".broadcastreceiver.receiver.StaticBroadcastReceiver"
     android:exported="true">
       <intent-filter>
          <action android:name="send_static_action"></action>
       </intent-filter>
   </receiver>

 动态广播
创建广播接收器

直接new该类的对象实例,然后重写方法 onReceive

// 创建广播接收器
    private BroadcastReceiver dynamicBroadcastReceiver= new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            Log.d("BroadcastReceiver","动态广播接收器接受了一个 - "+bundle.getString("data"));

        }
    };
注册广播接收者器类

一般在Activity的onCreate方法中注册

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_study);

        // 动态注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(SEND_DYNAMIC_ACTION);
        registerReceiver(dynamicBroadcastReceiver,intentFilter);
    }
解除注册
   @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(dynamicBroadcastReceiver);
    }

无序广播、有序广播

按照广播接收顺序划分

  • 无序广播-普通广播:所有接收器接收的广播没有先后顺序,几乎同时收到消息
  • 有序广播:发送的广播会按照接收器的优先级顺序被接受,同一时刻只会有一个接收器收到广播,且收到广播之后可以对广播进行截断和修改

有序广播

发送

使用语句  sendOrderedBroadcast

广播接收器 

注册时,设置优先级,优先级越大越先收到广播

// 动态注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(SEND_DYNAMIC_ACTION);
        intentFilter.setPriority(100);
        registerReceiver(dynamicBroadcastReceiver, intentFilter);

        // 注册有序广播
        // 有序广播设置优先级,优先级越大越先收到
        IntentFilter intentFilter1 = new IntentFilter();
        intentFilter1.addAction(SEND_DYNAMIC_ACTION);
        intentFilter1.setPriority(101);
        registerReceiver(broadcastReceiver2, intentFilter1);
截断广播 

abortBroadcast();  优先级高的广播接收器截断广播之后,下游的广播就不再会收到。 

修改广播 

上游的广播 使用 setResultExtras 传递一个新的 Bundle 或者使用 setResultData 传递一个字符串下游使用 getResultExtras 接收 Bundle,使用 getResultData 接收字符串

全局广播、本地广播

按照广播的传播范围划分

  • 本地广播:app内部
  • 全局广播:整个手机内部

全局广播

普通广播就是全局广播 

本地广播

只能使用动态注册,因为本地广播只能监听这个app内部的广播,在注册发送广播时,需要使用到LocalBroadcastManager 类。

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

        // 注册本地广播 - 只能动态注册
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
        IntentFilter local_intentFilter = new IntentFilter();
        intentFilter1.addAction(SEND_LOCAL_ACTION);
        localBroadcastManager.registerReceiver(new LocalBroadcastReceiver(),local_intentFilter);
    }
发送 
 Intent intent = new Intent();
 intent.setAction(SEND_LOCAL_ACTION);
 intent.putExtra("data", "本地广播");
 localBroadcastManager.sendBroadcast(intent);
 解除注册
 Intent intent = new Intent();
 intent.setAction(SEND_LOCAL_ACTION);
 intent.putExtra("data", "本地广播");
 localBroadcastManager.sendBroadcast(intent);

广播的作用?


原文地址:https://blog.csdn.net/weixin_43244083/article/details/140501982

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!