关键词:
文章目录
- Android第一行代码-广播机制
Android第一行代码-广播机制
类似的工作机制:最大的IP地址被保留作为广播地址使用,比如某个网络的IP范围为192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址为192.168.0.255。
为了方便进行系统级别的消息通知,Android也引入了一套类似的广播消息机制,相比于我前面举出的例子,Android中的广播机制会显得更加灵活。
广播机制简介(注册广播的方式一般有两种,在代码中注册和AndroidManifest.xml中进行注册。)
Android的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容。这些广播可能是来自系统的,也可能是来自其他应用的。
发生广播就是借助Intent,接收广播需要引入新的概念即广播接收器。
广播类型–标准广播(完全异步的广播,效率高,无法截断)
- 标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器机会都会在同一时刻接收到这条广播消息。因为他们没有任何先后顺序。
广播类型–有序广播(同步执行,有优先级,前面的广播接收器还可以截断正在传递的广播)
同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息。前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
接收系统广播
动态注册监听网络变化
广播接收器可以自由的对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能收到该广播。
注册广播的方式一般有两种,在代码中注册和AndroidManifest.xml中进行注册。其中前者被称为动态注册,后者被称为静态注册。
创建广播接收器(创建广播接收器:继承BroadReceive类,重写onReceive方法。注册广播:调用registerReceiver,通过IntentFilter的addAction传参决定要监听什么广播,)
如何创建一个广播接收器呢,只需创建一个类继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。广播接收器想要监听什么广播,就要添加相应的action。调用registerReceiver()方法进行注册。
如在注册时传入值为"android.net.conn.CONNECTIVITY_CHANGE"的IntentFilter,那么就会收到所有值为"android.net.conn.CONNECTIVITY_CHANGE"的广播,也就实现了监听网络变化的功能。
动态注册的广播接收器一定都要取消注册才行,我们是在onDestroy方法中调用unregisterReceiver方法来实现的。
package com.example.broadcasttest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Network;
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();
//创建了IntentFilter的实例,添加值为"android.net.conn.CONNECTIVITY_CHANGE"的action
//因为当网络状态发生变化的时候,系统发出的正是一条值为"android.net.conn.CONNECTIVITY_CHANGE"
//也就是说我们广播接收器要监听什么广播,就要添加相应的action
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
@Override
protected void onDestroy()
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
//定义了一个内部类,每当网络发生变化的时候,就会调用onReceive方法;
class NetworkChangeReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
//系统服务类,专门用于管理网络连接
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable())
Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
else
Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
Android系统为了保护用户设备的安全隐私,做了严格的规定:如果程序需要进行一些对用户来说比较敏感的操作,就必须在配置文件中声明权限才可以,否则程序将直接崩溃。比如这里系统的网络状态就是需要声明的,打开AndroidManifest.xml文件,在里面加入以下权限就可以访问系统网络状态了。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
静态注册实现开机启动(一定要在AndroidManifest.xml文件中配置才可以使用,程序未启动就可以接收到广播)
动态注册广播接收器的缺点:需要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。
如果想要在程序未启动的时候就接收到广播,就需要使用静态注册。
使用Android Studio的快捷方式创建广播接收器,右击com.example.broadcasttest包–》New–》Other–》Broadcast Receiver,之后显示的页面中,Exported属性表示是否允许广播接收器接收本程序之外的广播,Enabled属性表示是否启用这个广播接收器。
由于使用的是Android studio的快捷方式创建的,所以会自动在配置文件中对广播接收器进行注册。由于在Android系统启动完成后会发出一个值为android.intent.action.BOOT_COMPLETED的广播。因此我们在< intent-filter>标签中添加了相应的action。
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
系统开机广播也是需要权限的,需要使用< uses-permission>中加入一条android.permission.RECEIVE_BOOT_COMPLETED权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
发送自定义广播(标准广播:sendBroadcast,有序广播SendOrderBroadcast)
发送标准广播(sendBroadcast)
自定义广播接收器:
package com.example.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();
在AndroidManifest.xml中进行注册:
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
在MainActivity中发送广播:
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);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
);
发送有序广播
验证广播的跨进程通信
广播是一种可以跨进程的通信方式,因此我们在应用程序内发出的广播,其他的应用程序应该是可以收到的。
新建广播接收器AnotherBroadcastReceiver
package com.example.broadcasttest2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AnotherBroadcastReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();
在AndroidManifest.xml中添加:
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
这样AnotherBroadcastReceiver同样可以接收到com.example.broadcasttest.MY_BROADCAST的广播。
有序广播(SendOrderBroadcast())
发送有序广播只需要改动一行代码,即将sendBroadcast()方法改成sendOrderBroadcast方法。
sendOrderBroadcast的两个参数:
- Intent
- 与权限相关的字符串
可以通过android:priority属性给广播接收器设置一个优先级,优先级比较高的接收器就可以先收到广播,这里讲MyBroadcastReceiver的优先级设置为100,以保证它一定会在AnotherBroadcastReceiver之前收到广播。
通过< intent-filter>的android:priority就可以设置优先级。设置优先级之后,先收到广播的接收器就可以通过是否调用abortBroadcast()函数选择是否允许广播继续传递。
public class MyBroadcastReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context,Intent intent)
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
abortBroadcast();
使用本地广播(不可以通过静态注册方式来接收)
Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。
LocalBroadcastReceiver.java
package com.example.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class LocalBroadcastReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
MainActivity.java
package com.example.broadcasttest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
private IntentFilter intentFilter;
private LocalBroadcastReceiver localBroadcastReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
);
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastReceiver = new LocalBroadcastReceiver();
localBroadcastManager.registerReceiver(localBroadcastReceiver,intentFilter);
本地广播的用法并不复杂,主要是使用一个LocalBroadcastManager来对广播进行管理,提供发送和注册广播接收器的方法。
android广播机制(代码片段)
[转载](http://www.cnblogs.com/lwbqqyumidi/p/4168017.html)1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的... 查看详情
android第一行代码--service(四大组件之一)(代码片段)
文章目录Android第一行代码-Service服务是什么Android多线程编程线程的基本用法在子线程中更新UI通过异步消息处理机制解决在子线程中更新UI导致的报错问题解析异步消息处理机制1、Message(传递消息)2、Handler(处理者... 查看详情
android总结篇系列:android广播机制----学习(代码片段)
Android总结篇系列:Android广播机制1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式... 查看详情
android学习笔记-broadcast01-详解广播机制(代码片段)
前言广播是一个消息通知机制,Android提供了一套完整的API,允许应用程序自由地发送和接收广播。就是我们常说的Android四大组件之一的广播接收器(BroadcastReceiver).广播机制说明广播类型广播常分为两种类型ÿ... 查看详情
android学习笔记-broadcast01-详解广播机制(代码片段)
前言广播是一个消息通知机制,Android提供了一套完整的API,允许应用程序自由地发送和接收广播。就是我们常说的Android四大组件之一的广播接收器(BroadcastReceiver).广播机制说明广播类型广播常分为两种类型ÿ... 查看详情
第一行代码学习
1.开始启程你的第一行Android代码 2.先从看得到的入手探究活动3.软件也要拼脸蛋UI开发的点点滴滴4.手机平板要兼顾探究碎片5.全局大喇叭详解广播机制6.数据存储全方案详解持久化技术7.跨程序共享数据探究内容提供器8.丰富... 查看详情
android中的广播机制你了解多少?(代码片段)
前言Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接受自己所关心的广播内容,这些广播内容可能是来自于系统,也可能是来自于其他应用程序的;Android提供了一整套的API,允许... 查看详情
android第一行代码-内容提供器(contextprovidercontextresolver)(代码片段)
...跨程序共享数据--探究内容提供器内容提供器简介(Android实现跨程序共享数据的标准方式)运行时权限Android权限机制详解危险权限在程序运行时申请权限访问其他程序中的数据ContentResolver的基本用法(通过Context中的g... 查看详情
广播机制之动态注册和静态注册(代码片段)
...态注册时间开机启动静态注册示例广播机制广播机制简介Android中每个应用程序都可以对自己感兴趣的广播进行注册,这样程序就只会受到自己关注的广播了.广播有可能是来自系统的,也有可能是来自其他应用程序的Andorid中提供了... 查看详情
broadcastreceiver机制-android12(代码片段)
BroadcastReceiver机制android12-release查看androiddeveloper广播概览1.广播概览 一般来说,广播可作为跨应用和普通用户流之外的消息传递系统。应用可以注册接收特定的广播。广播发出后,系统会自动将广播传送给同意接收这... 查看详情
android第一行代码--service(四大组件之一)(代码片段)
文章目录Android第一行代码-Service服务是什么Android多线程编程线程的基本用法在子线程中更新UI通过异步消息处理机制解决在子线程中更新UI导致的报错问题解析异步消息处理机制1、Message(传递消息)2、Handler(处理者... 查看详情
个人技术总结(代码片段)
Android-广播机制1.技术概述我们都知道网络通信原理中,一个Ip网络范围中,最大的IP地址是被保留作为广播地址使用的,那么其实Android也引入了类似一套广播消息机制,而且对比来看显得更加灵活。因为Android中每个应用程序都... 查看详情
android——broadcastreceiver广播机制(自定义广播)(代码片段)
普通广播可见:Android——广播1.概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景... 查看详情
android——broadcastreceiver广播机制(自定义广播)(代码片段)
普通广播可见:Android——广播1.概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景... 查看详情
第一行代码笔记-第五章
1.标准广播,异步,所有广播接收器同时接收。 有序广播,同步,同一时间只一个广播接收器接收,待处理完才传递至下一个。2.动态注册广播接收器,即在代码中注册(记得取消注册),灵活自由,但必须在程序启动后才... 查看详情
androidbroadcastreceiver详解(代码片段)
1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1)同一app内部的同一组件内的消... 查看详情
《第一行代码》读书笔记二
一:广播1:广播接收器的使用步骤继承BroadcaseReceiver定义一个类,重写onReceive()方法——注册广播接收器——接受系统广播或其他地方发出的自定义广播并响应2:动态注册和静态注册广播接收器要注册后才能接受广播并响应,注册... 查看详情
android四大组件——广播(代码片段)
一、监听电量变化的广播第一步:创建一个广播接收者,继承自BroadcastReceiverprivateclassBatteryLevelReceiverextendsBroadcastReceiver@OverridepublicvoidonReceive(Contextcontext,Intentintent)Stringaction=inten 查看详情