Android——BroadcastReceiver使用

本文详细介绍了Android中的BroadcastReceiver(广播)机制,包括广播的分类、注册方式及如何实现跨页面和跨进程的数据通信。文中还提供了静态注册和动态注册广播的具体步骤,并对比了无序广播与有序广播的区别。

BroadcastReceiver

  1. BroadcastReceiver(广播)是Android四大组件之一
  2. 广播分为发送方和接收方,就算没有接收方,发送方也会发送数据
  3. 广播可以实现跨多个页面的数据通信
  4. 广播可以实现跨进程间的数据通信

广播的分类

无序广播:
不管有多少接收者,一旦发出了无序广播,所有监听此广播的接收者都能接收到。
有序广播:
按接收者的优先级。逐一传递。优先级最高的接收者先接收,如果不终止此广播,再往下传递。
粘滞广播:
当广播发出后,如果系统没有接收者,会一直等待,直到有接收者接收为止。

广播的注册方式

1、静态注册———在AndroidManifest中注册receiver
2、动态注册———通过在Activity中写代码实现广播注册

静态注册无序广播

广播的注册方式需要在接收方的项目中进行注册
进行静态注册需要在AndroidManifest进行receiver注册

//继承BroadcastReceiver子类的类名
<receiver android:name=".GostBroadcast">
   <intent-filter>
               //name中是发出的广播频道
          <action android:name="com.send"/>
   </intent-filter>
</receiver>

我们通过广播实现进程间的数据通信,也就是两个项目之间的通信
接收方要新建类继承BroadcastReceiver,实现onReceive抽象方法,此方法写在接收方中

public class GostBroadcast extends BroadcastReceiver {
    private String TAG="GostBroadcast";
    @Override
    public void onReceive(Context context, Intent intent) {
        //通过Toast打印
        Toast.makeText(context, "收到请回答GostBroadcast", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "广播++++++++++++++++++++++++++++++++++++");
    }
}

发送方Activity(另一个项目中)

public class BroadcastActivity extends AppCompatActivity {
   //定义一个按钮,发送广播
    private Button broadBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //绑定id,设置监听事件
        setContentView(R.layout.activity_broadcast);
        broadBtn=findViewById(R.id.broad_btn);
        broadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               // 发送广播,通过Intent进行广播的启动发送
                Intent intent=new Intent("com.send");
                sendBroadcast(intent);  //进行无序广播时用sendBroadcast()方法
            }
        });
     }  
 }

动态注册无序广播

广播的注册方式需要在接收方的项目中进行注册
动态注册不需要在AndroidManifest进行receiver注册,只要在Activity中写代码注册
接收方Activity注册

public class BroadBActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_b);
         // 1. 实例化BroadcastReceiver子类 与 IntentFilter
        GostBroadcast mBroadcastReceiver = new GostBroadcast();
        IntentFilter intentFilter = new IntentFilter();
        // 2. 设置接收广播的类型
        intentFilter.addAction("com.send");
        // 3. 动态注册:调用Context的registerReceiver()方法
        registerReceiver(mBroadcastReceiver, intentFilter);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除广播接收器
        unregisterReceiver(mBroadcastReceiver);
    }
}

新建类继承BroadcastReceiver

public class GostBroadcast extends BroadcastReceiver {
    private String TAG="GostBroadcast";
    @Override
    public void onReceive(Context context, Intent intent) {
        //通过Toast打印
        Toast.makeText(context, "收到请回答GostBroadcast", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "广播++++++++++++++++++++++++++++++++++++");
    }
}

发送方Activity与静态注册的方法一样

静态注册有序广播

进行静态注册需要在AndroidManifest进行receiver注册,与无序注册不同的是有序广播有优先级,需要在其中加入priority属性设置优先级接收一个int类型,范围是-1000至1000
同时需要写两个继承BroadcastReceiver的类

<receiver android:name=".GostBroadcast">
       <intent-filter android:priority="100" >
            <action android:name="com.send"/>
       </intent-filter>
</receiver>
<receiver android:name=".SecondBroadcast">
      <intent-filter android:priority="1000" >
           <action android:name="com.send"/>
      </intent-filter>
</receiver>

发送方Activity(另一个项目中)

public class BroadcastActivity extends AppCompatActivity {
    //定义一个按钮点击发送广播
    private Button broadBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast);
        //绑定id与设置监听事件
        broadBtn=findViewById(R.id.broad_btn);
        broadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent("com.send");
                //有序广播需要用sendOrderedBroadcast()方法发送
                sendOrderedBroadcast(intent,null);
            }
        });
    }
}

新建类继承BroadcastReceiver,有序广播需要建立两个类来比较

public class GostBroadcast extends BroadcastReceiver {
    private String TAG="GostBroadcast";
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "收到请回答GostBroadcast", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "广播++++++++++++++++++++++++++++++++++++");
        //终止此广播,不在传递下去
        abortBroadcast();
    }

}

动态注册有序广播

注册receive

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_b);
  // 1. 实例化BroadcastReceiver子类 &  IntentFilter
        GostBroadcast mBroadcastReceiver = new GostBroadcast();
        SecondBroadcast secondBroadcast=new SecondBroadcast();
        IntentFilter intentFilter1 = new IntentFilter();
        IntentFilter intentFilter2 = new IntentFilter();
        // 2. 设置接收广播的类型
        intentFilter1.addAction("com.send");
        //运用setPriority()方法设置优先级关系
        intentFilter1.setPriority(1000);
        intentFilter2.addAction("com.send");
        intentFilter2.setPriority(1000);
        // 3. 动态注册:调用Context的registerReceiver()方法
        registerReceiver(mBroadcastReceiver, intentFilter1);
        registerReceiver(secondBroadcast, intentFilter2);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除广播接收器
        unregisterReceiver(mBroadcastReceiver);
        unregisterReceiver(secondBroadcast);
    }
}

动态注册方法中也需要新建两个类继承BroadcastReceiver,同上述静态加载有序广播的方法一样

发送方Activity(另一个项目中)

public class BroadcastActivity extends AppCompatActivity {
    private Button broadBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast);
        broadBtn=findViewById(R.id.broad_btn);
        broadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent("com.send");
                //有序广播需要用sendOrderedBroadcast()方法发送
                sendOrderedBroadcast(intent,null);
            }
        });
    }
}

静态注册与动态注册的比较
这里写图片描述

上述就是我对BroadcastReceiver(广播)的理解与使用,希望能对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值