ANDROID 广播机制

本文详细介绍了Android广播机制,包括广播概述、接收广播的动态与静态注册、广播发送的类型,以及服务机制,强调了BroadcastReceiver的生命周期和使用场景。此外,还讲解了Service的启动、停止方式,IntentService的异步处理特性,以及Activity与Service的通讯方式,重点对比了started服务与bind服务的区别。
摘要由CSDN通过智能技术生成

目录

一、广播概述

一、概述
广播(Broadcast)机制用于进程/线程间通信,其中广播接收者BroadcastReceiver便是Android四大组件之一。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。广播分为广播发送广播接收两个过程。
发送广播的方法是使用Intent,而接收广播使用的是广播接收者(Broadcast Receiver)
BroadcastReceiver分为两类:

静态广播接收者:通过AndroidManifest.xml的标签来申明的BroadcastReceiver。
动态广播接收者:通过AMS.registerReceiver()方式注册的BroadcastReceiver,动态注册更为灵活,可在不需要时通过unregisterReceiver()取消注册。

从广播发送方式可分为二类:

标准广播(Normal broadcasts):通过Context.sendBroadcast()发送,是一种完全异步执行的广播
有序广播(Ordered broadcasts):通过Context.sendOrderedBroadcast()发送,是一种同步执行的广播

广播的功能和特征:
  1、广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了。从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码。广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期。所以有的时候我们可以把它当做函数看也未必不可。

2、和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。

3、每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。

应用场景

  • 同一应用具有多个进程的不同组件之间的消息通信
  • 不同应用间的组件之间的消息通信
  • 与Android系统在特定情况下的通信
    如:系统开机,网络变化等

二、接收广播之注册广播

注册广播有两种方式:动态注册和静态注册

1、非常驻型广播(动态注册):非常驻型广播,广播跟随程序的生命周期,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样你的广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。动态注册的广播,最后必须取消注册。这类广播,只有应用启动了,才能接收到广播。

实现动态注册需要以下内容

  • 一个广播接收器类 —— 实质就是一个继承自BoradCastReceiver的类,只要继承这个类,就有具体接收广播的能力了。
  • 重写父类的onReceive()方法 —— 接收到广播的时候,就会回调这个方法。因此,广播接收
    器的处理逻辑就写在这里。
  • 一个 IntentFilter 对象,广播接收器接收什么样的广播,由它的addAction()方法决定。
  • 在代码中注册广播接收器,通过registerReceiver方法。方法接受两个参数,一个是广播接收
    器实例,一个是IntentFilter实例。
    取消注册广播 ,通过unregisterReceiver() 方法—— 在哪里取消注册无所谓,只要保证取
    消注册就OK。
  • 如果需要权限,则在AndroidManifest.xml文件申明权限
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        intentFilter = new IntentFilter();
        //网络发生变化时系统发出的是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,
        //即想监听什么广播就在此添加相应action
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //创建NetworkChangeReceiver实例
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册实例
        registerReceiver(networkChangeReceiver, intentFilter);
    }
 
    @O
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值