android软件开发广播(android系统广播有哪些)

软件开发 1630
今天给各位分享android软件开发广播的知识,其中也会对android系统广播有哪些进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、android 7.0对开发者会有哪些影响

今天给各位分享android软件开发广播的知识,其中也会对android系统广播有哪些进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

android 7.0对开发者会有哪些影响

Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。 本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。

如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。

电池和内存

Android N 包括旨在延长设备电池寿命和减少 RAM 使用的系统行为变更。 这些变更可能会影响您的应用访问系统资源,以及您的系统通过特定隐式 Intent 与其他应用互动的方式。

低电耗模式

Android 6.0(API 级别

23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android N

则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU

和网络限制,进一步增强了低电耗模式。

图 1. 低电耗模式如何应用第一级系统活动限制以延长电池寿命的图示。

当设备处于充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制: 关闭应用网络访问、推迟作业和同步。 如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对 PowerManager.WakeLock、AlarmManager 闹铃、GPS

和 Wi-Fi 扫描应用余下的低电耗模式限制。 无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。

图 2. 低电耗模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。

请注意,激活屏幕或插接设备电源时,系统将退出低电耗模式并取消这些处理限制。 此项新增的行为不会影响有关使您的应用适应 Android 6.0(API 级别 23)中所推出的旧版本低电耗模式的建议和最佳实践,如低电耗模式和应用待机模式优化中所讨论。

您仍应遵循这些建议(例如使用 Google Cloud Messaging (GCM) 发送和接收消息)并开始安排更新计划以适应新增的低电耗模式行为。

Project Svelte:后台优化

Android N 删除了三项隐式广播,以帮助优化内存使用和电量消耗。 此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。 删除这些广播可以显著提升设备性能和用户体验。

移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION广播,让应用能够监控这些变更。

由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。

同理,应用可以注册接收来自其他应用(例如相机)的隐式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 广播。

当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。

为缓解这些问题,Android N 应用了以下优化措施:

面向 Android N 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。

在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。

应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向

Android N 的应用。

如果您的应用使用任何 Intent,您仍需要尽快移除它们的依赖关系,以正确适配 Android N 设备。 Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler API

提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 您甚至可以使用JobScheduler 来适应内容提供程序变化。

如需了解有关 Android N 中后台优化以及如何改写应用的详细信息,请参阅后台优化。

权限更改

Android N 做了一些权限更改,这些更改可能会影响您的应用。

系统权限更改

为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录被限制访问 (0700)。 此设置可防止私有文件的元数据泄漏,如它们的大小或存在。 此权限更改有多重副作用:

私有文件的文件权限不应再由所有者放宽,为使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而进行的此类尝试将触发SecurityException。

注:迄今为止,这种限制尚不能完全执行。 应用仍可能使用原生 API 或 File API 来修改它们的私有目录权限。 但是,我们强烈反对放宽私有目录的权限。

传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。 因此,尝试传递 file:// URI 会触发 FileUriExposedException。 分享私有文件内容的推荐方法是使用 FileProvider。

DownloadManager 不再按文件名分享私人存储的文件。

旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能出现无法访问的路径。

面向 Android N 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException。

通过使用DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 将下载位置设置为公共位置的旧版应用仍可以访问 COLUMN_LOCAL_FILENAME 中的路径,但是我们强烈反对使用这种方法。

访问由 DownloadManager 公开的文件的首选方式是使用 ContentResolver.openFileDescriptor()。

应用间共享文件

对于面向 Android N 的应用,Android 框架执行的 StrictMode API

政策禁止向您的应用外公开 file:// URI。 如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 FileUriExposedException 异常。

若要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。 进行此授权的最简单方式是使用 FileProvider 类。

如需有关权限和共享文件的更多信息,请参阅共享文件。

无障碍改进

为提高平台对于视力不佳或视力受损用户的可用性,Android N 做出了一些更改。这些更改一般并不要求更改您的应用代码,不过您应仔细检查并使用您的应用测试这些功能,以评估它们对用户体验的潜在影响。

屏幕缩放

Android N 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度 sw320dp,该宽度是

Nexus 4 的宽度,也是常规中等大小手机的宽度。

图 3. 右侧屏幕显示的是一台运行 Android N 系统映像的设备增大显示尺寸后的效果。

当设备密度发生更改时,系统会以如下方式通知正在运行的应用:

如果是面向 API 级别 23 或更低版本系统的应用,系统会自动终止其所有后台进程。 这意味着如果用户切换离开此类应用,转而打开“Settings”屏幕并更改 Display size 设置,则系统会像处理内存不足的情况一样终止该应用。 如果应用具有任何前台进程,则系统会如处理运行时变更中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。

如果是面向 Android N 的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时变更中所述。

大多数应用并不需要进行任何更改即可支持此功能,不过前提是这些应用遵循 Android 最佳实践。具体要检查的事项:

在屏幕宽度为 sw320dp 的设备上测试您的应用,并确保其充分运行。

当设备配置发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查配置变更。

注:如果您要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。 保存这些元数据便于您在配置变更后决定是否需要刷新缓存数据。

避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素 (dp)

单位指定尺寸。

设置向导中的视觉设置

Android N 在“Welcome”屏幕中加入了“Vision Settings”,用户可以在新设备上设置以下无障碍功能设置: Magnification gesture、Font size、Display size 和 TalkBack。 此项变更增强了与不同屏幕设置相关的错误的可见性。

要评估此功能的影响,您应在启用这些设置的状态下测试应用。 您可以在Settings Accessibility 中找到这些设置。

NDK 应用链接至平台库

Android N 做了一些命名空间更改,以阻止加载非公开 API。 如果您使用 NDK,则只能使用 Android 平台提供的公开 API。 在下一个官方发布的 Android 版本上使用非公开 API 会导致应用崩溃。

为提醒您使用了非公开 API,在 Android N

设备上运行的应用会在有应用调用非公开 API 时在日志消息输出中生成一个错误。

此错误还会作为消息显示在设备屏幕上,以帮助增强您对此情况的认识。 您应检查应用代码以删除使用非公开平台

API,并使用预览版设备或模拟器全面测试应用。

如果您的应用依赖平台库,则请参见 NDK 文档,了解使用公开 API 等效项替换普通私有 API 的典型修复。 您还可以链接至平台库,而无需实现此应用,如果应用使用的库是平台的一部分(例如 libpng),但不属于 NDK,则更可如此。 此情况下,请确保您的 APK 包含您打算链接到的所有 .so 文件。

注意:有些第三方库可能会链接至非公开 API。 如果您的应用使用这些库,那么当您的应用在下一个官方发布的 Android 版本上运行时可能会出现崩溃现象。

应用不应依赖或使用不属于 NDK

的原生库,因为这些库可能会发生更改或从一个 Android 版本迁移至另一版本。 例如,从 OpenSSL 切换至 BoringSSL

即属于此类更改。 此外,不同的设备可能提供不同级别的兼容性,因为不属于 NDK 中的平台库没有兼容性要求。 如果您必须在较旧设备上访问非 NDK

库,则请依据 Android API 级别进行加载。

为帮助您诊断此类问题,下面列举了一些在您试图使用 Android N 开发应用时可能遇到的 Java 和 NDK 错误:

Java 错误示例:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"

is not accessible for the namespace "classloader-namespace"

NDK 错误示例:

dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

以下是遇到这类错误的应用的一些典型修复:

可以使用标准 JNI 函数来替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:

AndroidRuntime::getJavaVM - GetJavaVM from jni.h

AndroidRuntime::getJNIEnv - JavaVM::GetEnv or

JavaVM::AttachCurrentThread from jni.h.

可以使用公开 alternative __system_property_get 来替代使用 libcutils.so 中的 property_get 符号。如需这样做,请使用__system_property_get 及以下 include 函数:

#include sys/system_properties.h

应使用应用本地版本来替代使用 libcrypto.so 中的 SSL_ctrl 符号。例如,您应在 .so 文件中静态链接 libcyrpto.a,或者在应用中包含您自己的来自 BoringSSL 或 OpenSSL 的动态 libcrypto.so。

Android for Work

Android N 包含一些针对面向 Android

for Work 的应用的变更,包括对证书安装、密码重置、二级用户管理、设备标识符访问权限的变更。如果您是要针对 Android for

Work 环境开发应用,则应仔细检查这些变更并相应地修改您的应用。

您必须先安装授权证书安装程序,然后 DPC 才能对其进行设置。 对于面向 N SDK 的个人资料和设备所有者应用,您应在设备策略控制器 (DPC) 调用DevicePolicyManager.setCertInstallerPackage() 之前安装授权证书安装程序。 如果尚未安装此安装程序,则系统会引发IllegalArgumentException。

针对设备管理员的重置密码限制现在也适用于个人资料所有者。 设备管理员无法再使用 DevicePolicyManager.resetPassword() 来清除或更改已经设置的密码。 设备管理员仍可以设置密码,但只能在设备没有密码、PIN 或图案时这样做。

即使设置了限制,设备所有者和个人资料所有者仍可以管理帐户。而且,即使具有 DISALLOW_MODIFY_ACCOUNTS 用户限制,设备所有者和个人资料所有者仍可调用 Account Management API。

设备所有者可以更轻松地管理二级用户。当设备在设备所有者模式下运行时,系统将自动设置 DISALLOW_ADD_USER 限制。 这样可以防止用户创建非托管二级用户。 此外,CreateUser() 和 createAndInitializeUser() 方法已弃用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。

设备所有者可以访问设备标识符。设备所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 访问设备的 Wi-Fi MAC 地址。 如果设备上从未启用 Wi-Fi,则此方法将返回一个 null 值。

工作模式设置控制工作应用访问。当工作模式关闭时,系统启动器通过使工作应用显示为灰色来指示它们不可用。 启用工作模式会再次恢复正常行为。

如需了解有关 Android N 中针对 Android for Work 所做变更的详细信息,请参阅 Android for

Work 更新。

注解保留

Android N 在注解可见性被忽略时修复错误。这种问题将启用本不应被允许的运行时访问注解。 这些注解包括:

VISIBILITY_BUILD:仅应编译时可见。

VISIBILITY_SYSTEM:运行时应可见,但仅限基本系统。

如果您的应用依赖这种行为,请在注解中添加一项运行时必须可用的保留政策。 您可通过使用 @Retention(RetentionPolicy.RUNTIME) 来如此做。

其他重要说明

如果一个应用在 Android N 上运行,但却是针对更低 API 级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。 应用必须能够正常处理此情景。 否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。

您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。

在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。

Android N 上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (Setting Display Font size) 并随后从最近使用记录中恢复运行应用,来验证应用行为。

由于之前的 Android 版本中的一项错误,系统未能将对主线程上的一个 TCP 套接字的写入操作举报为严格模式违反。 Android N 修复了此错误。呈现出这种行为的应用引发 android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致 ANR 和卡顿的高尾延迟。

Debug.startMethodTracing() 方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非 SD 卡顶级。 这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE 使用这些 API 的权限。

许多平台 API 现在开始检查在 Binder 事务间发送的大负载,系统现在会将 TransactionTooLargeExceptions 再次作为 RuntimeExceptions 引发,而不再只是默默记录或抑制它们。

一个常见例子是在 Activity.onSaveInstanceState() 上存储过多数据,导致 ActivityThread.StopInfo 在您的应用面向

Android N 时引发 RuntimeException。

如果应用向 View 发布 Runnable 任务,并且 View 未附加到窗口,系统会用 View 为 Runnable 任务排队;在 View 附加到窗口之前,Runnable 任务不会执行。

此行为会修复以下错误:

如果一项应用是从并非预期窗口 UI 线程的其他线程发布到 View,则Runnable 可能会因此运行错误的线程。

如果 Runnable 任务是从并非环路线程的其他线程发布,则应用可能会曝光 Runnable 任务。

如果 Android N 上一项有 DELETE_PACKAGES 权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。

在这种情况下,应用在调用 PackageInstaller.uninstall() 时的返回状态应为 STATUS_PENDING_USER_ACTION。

android开发一般都使用什么框架

Android开发框架介绍

编辑文档

学分 +2

开发框架方面包含基本的应用功能开发、数据存储、网络访问这三大块:

一、应用方面

一般而言一个标准的Android程序由如下4部分组成即Activity、Broadcast Intent Receiver、Service、Content Provider: 1. Activity是最频繁、最基本的模块,在Android中,一个Activity就是手机上一屏,相当于一个网页一样,所不同的是,每个Activity运行结束了,有个返回值,类似一个函数一样。Android系统会自动记录从首页到其他页面的所有跳转记录并且自动将以前的Activity压入系统堆栈,用户可以通过编程的方式删除历史堆栈中的Activity Instance。

Activity类中主要是跟界面资源文件关联起来(res/layout目录下的xml资源,也可以不含任何界面资源),内部包含控件的显示设计、界面交互设计、事件的响应设计以及数据处理设计、导航设计等application设计的方方面面。 2. Broadcast Intent Receiver

Intent提供了各种不同Activity进行跳转的机制,譬如如果从A activity跳转到B activity,使用Intent来实现如下: Intent in = new Intent(A.this, B.class); startActivity(in);

BroadcastReceiver提供了各种不同的Android应用程序进行进行进程间通讯的机制,譬如当电话呼叫来临时,可以通过BroadcastReceiver发布广播消息。对于用户而言,BroadcastReceiver是不透明的,用户无法看到这个事件,BroadcastReceiver通过NotificationManager来通知用户这些事件发生了,它既可以在资源AndroidManifest.xml中注册,也可以在代码中通过Context.registerReceiver()进行注册,只要是注册了,当事件来临的时候,即时程序没有启动,系统也在需要的时候会自动启动此应用程序;另外各应用程序很方便地通过Context.sendBroadcast()将自己的事情广播给其他应用程序;

3. Service,跟Windows当中的Service完全是一个概念,用户可以通过startService(Intent service)启动一个Service,也可通过Context.bindService来绑定一个Service.

4. Content Provider,由于Android应用程序内部的数据都是私有的,Content Provider提供了应用程序之间数据交换的机制,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去,并且隐蔽了具体的数据存储实现,标准的ContentProvider提供了基本的CRUD(Create,Read,Update,Delete)的接口,并且实现了权限机制,保护了数据交互的安全性; 一个标准的Android应用程序的工程文件包含如下几大部分: - Java源代码部分(包含Activity),都在src目录当中;

- R.java文件,这个文件是Eclipse自动生成与维护的,开发者不需要修改,提供了Android对的资源全局索引; - Android Library,这个是应用运行的Android库;

- assets目录,这个目录里面主要用与放置多媒体等一些文件;

- res目录,放置的是资源文件,跟VC中的资源目录基本类似,其中的drawable包含的是图片文件,layout里面包含的是布局文件,values目录里面主要包含的是字符串(strings.xml)、颜色(colors.xml)以及数组(arrays.xml)资源;

- AndroidManifest.xml,这个文件异常重要,是整个应用的配置文件,在这个文件中,需要声明所有用到的Activity、Service、Receiver等。

安卓广播接收器怎么判断是哪个应用发送的?想要只接收自身应用广播,怎么实现?

安卓广播接收器Intent,它有提供过滤器功能,也就是开发者定义过滤条件,只有是这个条件的广播才接收,这样就可以接收指定广播。这也是安卓广播的基础知识功能,具体自己查阅相关资料,很简单的。

我用eclipse开发android里的一个播放器软件,运行出现Unable to start service Intent not found 错误

你这里应该有两点问题:

1.manifest里的service/service标签有 intent-fliter和actio等子标签,

注意:intent-fliter和actio等子标签是对于广播接收receiver的,不是针对服务service的,所以去掉intent-fliter等子标签。改成:Service android:name=".Music" /Service 就行了。

2. 在叫PlayService类的Activity中,

按钮事件中的:

startService(new Intent("com.PlayService.test.START_AUDIO_SERVICE"));

就要相应的该为:

startService(new Intent(PlayService.this,Music.class));

你要注意service和receiver这两个标签的区别哦!

Android软件开发主要是学习什么的?

近半年来,手机的安卓系统与ios系统是目前主流的手机系统,Android软件开发主要是学习什么的?IT培训发现安卓开发的技术很多的,如果想一次性学好是不实际的,但下面这些基础还是要学好的。

1、Activity生命周期

虽然Android中有四大组件,但是不可否认Activity是最常用的。所以熟练掌握Android的生命周期是必须的。其实生命周期就是记住Activity的那些方法在什么时候被系统调用,这样才可以把对应的逻辑代码写到合适的方法内部去。

至于服务和广播组件可以稍微缓一下,到实际使用的时候再学习都可以。

2、界面开发技术

界面开发是一种基本的技术,几乎所有的程序里面都需要用到。在Android开发中界面开发分为3种:

1)使用xml文件布局

使用xml首先对于界面进行布局,然后在Activity里面进行引用是最常见的应用软件开发技术,这种方式使用的最大,需要学习的内容也最多。学习时需要熟悉:

a)五种Layout布局

深刻理解五种布局组织控件的方式是一个基本的基础,这样你才可以在实际的界面中灵活的使用每种布局结构,构造出需要的界面。

b)常用控件

控件有很多,至少要知道每种控件是做什么的,至于里面的特定参数和方法可以学要的时候再去查

c)界面美化

系统的控件很多时候无法满足要求,需要通过添加背景更换图片等进行美化,要熟悉每种控件如何去美化。

掌握了上面的内容,通过布局的嵌套就可以制作出各种界面,如果在熟悉include的使用就可以减少xml的重复,方便后期的修改和维护了。

2)使用代码动态创建

有些时候需要动态的创建一些布局和控件,这个就需要使用LayoutInflater去创建一些动态的界面了。

3)自己绘制界面

游戏中常用,继承SurfaceView自己绘制。

3、数据存储技术

Android中的数据存储方式有3种:

1)SharedPrefereneces存储

对于简单的数据可以使用该方式存储,以键值对的方式存储一些基本的数据。

2)文件存储

将数据以文件的形式存储,可以是手机自身的存储也可以是SD卡,文件的数据格式自己定义。

3)SQLite数据库存储

使用标准SQL语句进行操作,复杂数据的首选。

4、网络编程

现在的Android程序不需要联网的已经不多了。所以网络编程也是必须的,一般的公司都会封装有自己的联网结构,但是基本的联网还是要熟悉。

1)HTTP联网

使用Http联网+Json数据格式是现在很多客户端的首选。

2)Socket联网

至于蓝牙等连接方式则可以在项目需要的时候学习。

对于手机的系统功能,如拨打电话、发送短信、读取系统参数等则可以根据需要在学习,不麻烦的。

其次,手机软件相关

Android开发不同于普通的电脑软件开发,需要了解手机的操作习惯,知道手机的屏幕不大、内存有限,电池有限等,在实际开发和设计时尽量考虑。

为什么Android要使用各种BroadcastReceiver

作为Android四大组件之一的BroadcastReceiver(广播接收者),同Activity(活动)一样,经常被大家用到,网上也是一堆对它的讲解,那么为什么Android要用广播接收者这种机制呢?

广播分为:普通广播和有序广播

1.Normal broadcasts(普通广播):Normal broadcasts是完全异步的可以同一时间被所有的接收者接收到。消息的传递效率比较高。但缺点是接收者不能将接收的消息的处理信息传递给下一个接收者也不能停止消息的传播。可以利用Context.sendBroadcast发送。

2.Ordered broadcasts(有序广播):Ordered broadcasts的接收者按照一定的优先级进行消息的接收。一次传送到一个接收器。 随着每个接收器依次执行,它可以将结果传播到下一个接收器,或者它可以完全中止广播,使得它不会被传递到其他接收器。 命令接收器运行可以用匹配的意图过滤器的android:priority属性控制; 具有相同优先级的接收器将以任意顺序运行。可以利用Context.sendOrderedBroadcast发送。

官网上介绍广播是用的监听系统网络状况的例子,其实关键字在于“监听”。

(1) 创建广播接收者

BroadcastReceiver是一个抽象类,所以我们要创建自己的广播接收者就要继承它,继承后会有提示重写onReceive方法。

public class NetworkBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();

if (activeNetwork != null activeNetwork.isAvailable()) {

Toast.makeText(context, "有网络连接", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(context, "无网络连接", Toast.LENGTH_SHORT).show();

}

}

}

}

广播接收者的生命周期是从接收广播开始,到onRecevier方法执行完成结束,时间很短,一般不允许处理大批量耗时操作。这里顺便给出打印NetworkInfo的信息以供参考:

NetworkInfo:

type: WIFI[,type_ext: WIFI],

state: CONNECTED/CONNECTED,

reason: (unspecified),

extra: "TP-LINK_EFE8",

roaming: false,

failover: false,

isAvailable: true,

isConnectedToProvisioningNetwork: false,

isIpv4Connected: true,

isIpv6Connected: false

[type: MOBILE[LTE],

state: CONNECTED/CONNECTED,

reason: connected,

extra: cmnet,

roaming: false,

failover: false,

isAvailable: true,

isConnectedToProvisioningNetwork: false]

(2) 静态注册广播

静态注册广播,需要在AndroidManifest.xml中,添加recevier/ 标签,将广播接收者注册到应用中。要添加过滤器IntentFilter,由于系统网络变化时会发送ConnectivityManager.CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE")的广播,所以我们要监听这条广播。

receiver android:name=".NetworkBroadcastReceiver"

intent-filter android:priority="1000"

action android:name="android.net.conn.CONNECTIVITY_CHANGE"/

/intent-filter

/receiver

这里priority代表的是执行顺序的优先级,取值[-1000,1000],后面的有序广播会讲到。

(3) 动态注册广播

i.意图过滤器 IntentFilter 用于给BroadcastReceiver绑定监听广播类型

ii.自定义的BroadcastReceiver,例如上文的NetworkChangeBroadcastReceiver

iii.注册方法 Context.registerReceiver(Receiver, IntentFilter)

iv.反注册方法 unregisterReceiver(Receiver)

IntentFilter mFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

NetworkChangeBroadcastReceiver mReceiver = new NetworkChangeBroadcastReceiver();

registerReceiver(mReceiver, mFilter);

@Override

public void onDestroy() {

super.onDestroy();

unregisterReceiver(mReceiver);

}

这段代码是成对出现的,可以在onCreate的时候注册,在onDestroy的时候反注册,也可以在onResume和onPause中执行这写方法。不过Google API推荐的做法,在activity的onResume()中注册,在onPause()反注册。效果是当界面pause时,就不接收广播,从而减少不必要的系统开销。还有就是一定要主动反注册你的广播,否则会出现异常。

动态注册和静态注册的差别:动态注册后,广播接收者会依赖Activity的生命周期,而静态注册的广播不会,只要是系统有发出的广播,它都会接收,与程序是否启动无关。

(4) 发送普通广播

具体使用的方法是sendBroadcast(Intent intent),通过隐式调用就可以,注意action是你自定义的,意思就是不可以发送系统广播,我试了,直接就崩了。

Intent intent = new Intent();

intent.setAction("com.fleming.chen.mybroadcast");

sendBroadcast(intent);

针对(3)(4)两点,如果你要用到的广播仅仅是应用里的,那么你可以用LocalBroadcastManager这个类,它与上述描述中的区别在于:

LocalBroadcastManager.getInstance(context).registerReceiver(mReceiver, mFilter);

LocalBroadcastManager.getInstance(context).unregisterReceiver(mReceiver);

LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

通过sendBroadcast发送的广播,不会被通过LocalBroadcastManager类注册的广播接收者接收,反之也是如此,两者是不可以”互通友谊“的,推荐使用LocalBroadcastManager来管理广播。

(5) 发送有序广播

上面讲了那么多都是普通广播,那什么又是有序广播呢?

有序广播关键在于这类广播是有序的,上文中提到priority,这是IntentFilter的属性,用来让不同的广播拥有不同的执行顺序,即优先级不同。

定义三种不同优先级的广播接收者:

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

String message = getResultData();

Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

setResultData("这是修改后的数据");//第一个接收后处理一下,再交给下一个

}

}

}

public class MyBroadcastReceiver2 extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

String message = getResultData();//得到上一个的处理结果

Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

abortBroadcast();//主动停止广播,不再继续传下去

}

}

}

public class MyBroadcastReceiver3 extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals("com.fleming.chen.myreceiver")) {

//此时虽然该广播接收者也监听了,不过也没有内容

Toast.makeText(context, getResultData(), Toast.LENGTH_SHORT).show();

}

}

}

receiver android:name=".MyBroadcastReceiver"

intent-filter android:priority="1000"

action android:name="com.fleming.chen.myreceiver"/

/intent-filter

/receiver

receiver android:name=".MyBroadcastReceiver2"

intent-filter android:priority="0"

action android:name="com.fleming.chen.myreceiver"/

/intent-filter

/receiver

receiver android:name=".MyBroadcastReceiver3"

intent-filter android:priority="-1000"

action android:name="com.fleming.chen.myreceiver"/

/intent-filter

/receiver

Intent intent = new Intent();

intent.setAction("com.fleming.chen.myreceiver");

sendOrderedBroadcast(intent, null, null, null, 0, "这是初始的数据", null);

对于广播的内容,在Android 7.0上做了修改,即Project Svelte:后台优化

Android 7.0 移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。

移动设备会经历频繁的连接变更,例如在 WLAN 和移动数据之间切换时。目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。

同理,在之前版本的 Android 中,应用可以注册接收来自其他应用(例如相机)的隐式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。

为缓解这些问题,Android 7.0 应用了以下优化措施:

面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。

应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。

如果您的应用使用任何 intent,您仍需要尽快移除它们的依赖关系,以正确适配 Android 7.0 设备。Android 框架提供多个解决方案来缓解对这些隐式广播的需求。例如,JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。您甚至可以使用 JobScheduler 来适应内容提供程序变化。

所以说,在Android的世界,到处都充满着广播,就是为了用来监听手机的各种状态,给用户提醒,这是一种很好的用户体验,不过任何事情都是如此,广播也不可以多用哦,

关于android软件开发广播和android系统广播有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

扫码二维码