android 广播的发送和接收

    在Android中 Broadcast是一种 广泛运用在引用程序之间传输信息的机制。
而BroadcastReceiver 是对发送出来的Broadcaset进行过滤接受并响应的一类组件。
如果不需发送广播到别的应用 使用 LocalBroadcastManger就可以了。

发送和接收流程

发送和接受的过程:

1. 发送
    首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息(如action 和 category)封装进intent对象,然后调用 Context.sendBroadcast() 、sendOrderBroadcast()或sendStickBroadcast()方法,把intent对象以广播的形式发送出去
2. 接收
    当intent发送后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的intent匹配。若匹配就会调用BroadcastReceiver的onReceiver() 方法。所以 我们定义一个BroadcastReceiver的时候必须实现onReceiver()方法
3. Note:
    若在使用sendBroadcast()的方法时指定了接受权限,则只有在AndroidManifest.xml文件中声明了对应权限的BroadcastReceiver才能就收到;
    同样的,如果在注册BroadcastReceiver时指定了可接受的Broadcast的权限,则只有在包的AndroidManifest.xml中用标签声明了。拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。

虽然 广播的发送和接受都是通过intent类,但是广播intent完全和 启动activity的intent不同。
BroadcastReceiver是无法看到启动activity的intent的。同样的,当你发送一个Broadcast Intent 是不会去发现或启动一个activity的。
两者是完全不同的。启动activity的intent是属于前台用户可以看到的操作,而 Broadcat Intent是后台操作 。通常用户是看不到 的。*

广播类型

两大类 广播类型 :
- 1. Normal broadcasts(普通广播) :使用 Context.sendBroadcast ;完全是异步操作,广播发出后广播的所有接受者通常都在同一时间运行并得到结果,但是顺序不固定。这样效率是很高的但是 接收器的结果并不能影响其他的接受者
- 2. Orderd broadcasts(有序广播) :同步操作一次发送到一个接受者 ,按照预先声明的顺序依次接受,(-1000~1000)优先级高的优先接受到广播,优先级高的可以更改广播或者完全终止这个广播(abortBroadcast()),那优先级低的接受者将不能接受到

接收广播

使用broadcastsReceiver 接受广播,定义自己的广播接收器 只需继承BroadcastsReceiver;
广播接收器创建完毕后需要注册才能接受到。注册分为两种 动态和静态;如果发送的广播附带有权限 ,那接受者必须有相应的权限才能接受到

在BroadcastReceiver中一般是用来启动 某个activity或者启动某个服务,不允许执行耗时操作,也不允许开线程,最好是操作不要超过10秒。*

android 开发中,广播是经常会用到的,我来记录一下动态注册广播的简单用法

一、自定义一个广播+接收广播
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String msg = intent.getStringExtra("message");
            if (msg.equals("pay")) {
                Toast.makeText(MainActivity.this, "收到广播", Toast.LENGTH_SHORT).show();
            }
        }
    }
    MyBroadcastReceiver 是我自定义的一个广播类,它可以是内部类也可以是外部类,继承 BroadcastReceiver
    onReceive方法里写的就是收到广播之后的操作
    同时可以获取发送广播时传递的参数 intent.getStringExtra("message");

二、动态注册广播
    //广播
    private MyBroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        receiver = new MyBroadcastReceiver();
        // 动态注册广播接受者
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("wechat.pay.Broadcast");//要接收的广播
        registerReceiver(receiver, intentFilter);//注册接收者
    }
    通过 registerReceiver() 方法,传入MyBroadcastReceiver和IntentFilter,动态注册一个广播
    MyBroadcastReceiver 就是上面自定义的广播类
    IntentFilter 设置了一个“暗号”,用于区分不同的广播

三、发送广播
    Intent intent=new Intent("wechat.pay.Broadcast");
    intent.putExtra("message","pay");
    sendBroadcast(intent);
    通过 sendBroadcast()方法发送广播
    Intent 设置了一个“暗号”,用于区分不同的广播,与动态注册的“暗号”相对应
    同时,Intent也可以传递参数 intent.putExtra("message","pay"); 

四、销毁广播
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
    在哪个Activity或Fragment里注册的广播,就在哪里销毁,不销毁的话可能会造成内存泄漏

实例2:

定义 接收器 接收网络变化

继承 BroadcastReceiver

/**
 * Created by sky-mxc
 * 网络状态改变接收器
 */

public class NetworkReceiver extends BroadcastReceiver {

    private static final String TAG = "NetworkReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG,"=====网络状态改变了");
        Toast.makeText(context,"网络状态改变了",Toast.LENGTH_LONG).show();
    }
}

静态注册

    静态注册:在manifest文件 使用 标签注册 ,并在标签内设置过滤器(intentFilter) 什么时候都可以接受到广播,只要应用程序安装了 就是注册了,如果有广播就能接受 但是规定有部分广播 静态注册无法接受 例如屏幕的关闭和点亮广播。

<receiver android:name=".receiver.NetworkReceiver">
    <intent-filter >
    <!--priority 默认0-->
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
    </intent-filter>
</receiver>

动态注册

动态注册: 动态的在代码中定义。先定义设置好一个IntentFilter对象。然后在需要注册时调用Context.registerReceiver(),如果取消就调用Context.unregisterReceiver()方法。(动态注册的BroadcastReceiver在context被销毁后也会被干死)

使用 context.registerReceiver() 注册

receiver = new NetworkReceiver();
IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
intentFilter.setPriority(600);
registerReceiver(receiver,intentFilter);

取消注册 context.unregisterReceiver();


    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

 

发送广播

使用方法 sendBroadcast() 发送广播。

//发送普通广播
Intent intent = new Intent("com.mxc.example.broadcast.normal");
intent.putExtra("type","normal");
sendBroadcast(intent);

接收发送的广播

Manifest文件注册(静态注册)

<receiver android:name=".receiver.MyReceiver">
    <intent-filter>
        <action android:name="com.mxc.example.broadcast.normal"/>
    </intent-filter>
</receiver>

接收发送的数据

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG,"==action:"+intent.getAction()+"===time:"+ SystemClock.currentThreadTimeMillis());
        Log.i(TAG,"==type:"+intent.getStringExtra("type"));
    }
}

发送有序广播

使用 sendOrderedBroadcast() 如果接受者不需要权限 设置为null即可

Intent orderIntent = new Intent("com.mxc.example.broadcast.order");
orderIntent.putExtra("type","order");
//不添加权限
sendOrderedBroadcast(orderIntent,null);

可以通过 priority 属性来设置接受者的优先级,优先级的接受者可以 终止广播的发送或者 添加额外的数据或者修改 发送的广播数据

终止 广播

if (intent.getAction().equals("com.mxc.example.broadcast.order")){
    //终止广播
    abortBroadcast();
    }

添加或者修改数据

//增加额外的结果
Bundle b = getResultExtras(true);//获取数据 如果没有就创建
b.putString("result","MyReceiver");
setResultExtras(b);

获取 额外的数据

Log.e(TAG,"==result:"+getResultExtras(true).getString("result"));

 I/MyReceiver: ==action:com.mxc.example.broadcast.order===time:390
 I/MyReceiver: ==type:order
 I/SecondReceiver: ==action:com.mxc.example.broadcast.order===time:391
 I/SecondReceiver: ==type:order
 E/SecondReceiver: ==result:MyReceiver

本地广播

本地广播和广播的操作几乎是一致的不过是使用 LocalBroadcastManager 来管理的;发送的注册都是 LocalBroadcastManager实例来管理

本地广播和 广播一样 分为 异步广播和同步广播

发送本地广播

Intent localIntent = new Intent("com.example.broadcast.local.async");
manager.sendBroadcast(localIntent);
//发送 同步的(有序)的广播
//manager.sendBroadcastSync(localIntent);

接收本地广播

manager = LocalBroadcastManager.getInstance(this);
receiver = new LocalReceiver();
IntentFilter filter = new IntentFilter("com.example.broadcast.local.async");
manager.registerReceiver(receiver,filter);

各种广播
<action android:name="android.intent.action.BOOT_COMPLETED"></action> 开机广播
<permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 接受的权限
android.intent.action.SCREEN_OFF 屏幕点亮 规定 只有动态注册才可以
android.intent.action.SCREEN_ON 屏幕关闭 规定 只有动态注册才可以
android.net.conn.CONNECTIVITY_CHANGE 网络状态改变

实例3

APP之间的广播使用

1.比如在一个app发送了广播。传递的值为:

public static final String LEI_SHI_BROADCAST = "com.thunder.ktv.INIT_COMP”

我们需要在我们的应用中接收到这个广播进行事件的处理。需要定义动态注册

1.注册广播

receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter(LEI_SHI_BROADCAST);
getActivity().registerReceiver(receiver,intentFilter);

2.接收广播

/**
 * 接收app传过来的广播
 */
public static class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        android.util.Log.d(TAG, "onReceive: " + intent.getAction());
        if (intent.getAction().equals(LEI_SHI_BROADCAST)) {
        android.util.Log.d(TAG, "onReceive: " + intent.getAction());
            }
        }
    }
}

3.销毁广播

@Override
public void onDestroy() {
    super.onDestroy();
    getActivity().unregisterReceiver(receiver);
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以通过BroadcastReceiver来接收广播消息,并且通过Intent启动新的Activity来调用UI界面。 首先,需要创建一个继承自BroadcastReceiver的类,用于接收广播消息。在onReceive()方法中,可以处理接收到的广播消息,例如启动新的Activity。 接下来,在需要发送广播消息的地方,使用Intent来创建一个新的广播消息,并使用sendBroadcast()方法发送出去。 在接收广播消息后,可以使用Intent来启动一个新的Activity,并将需要传递给该Activity的数据通过Intent.putExtra()方法添加到Intent中。最后,使用startActivity()方法启动该Activity。 以下是示例代码: 创建BroadcastReceiver类: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 接收广播消息后,启动新的Activity Intent newIntent = new Intent(context, MyActivity.class); newIntent.putExtra("data", "Hello World"); context.startActivity(newIntent); } } ``` 发送广播消息: ``` Intent intent = new Intent("com.example.mybroadcast"); sendBroadcast(intent); ``` 注意:需要在AndroidManifest.xml文件中为BroadcastReceiver和Activity注册相应的标识符。例如: ``` <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.mybroadcast" /> </intent-filter> </receiver> <activity android:name=".MyActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值