android 7.0 短信监控,Android 7.0 监听网络变化的示例代码
Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可。
public class NetChangeReceiver extends BroadcastReceiver {
private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)){
Toast.makeText(context, "Net Changed", Toast.LENGTH_SHORT).show();
}
}
}
package="com.outman.example.androidtest">
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true">
上面代码,在Android7.0设备前,当网络切换时,能收到消息。而在Android7.0及以上设备,则无法收到。
Android7.0 行为变更上明确说明
Android 7.0 移除了三项隐式广播,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。
为缓解这些问题,Android 7.0 应用了以下优化措施:
面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。
解决办法
1. 大家都知道,注册广播有两种方式,一种是在AndroidManifest.xml中,另一种通过register方法。
Android文档中描述,通过在AndroidManifest.xml中注册方式,App在前后台都无法接收到广播。而通过register的方式,当App在运行时,是可以接收到广播的。
Note: A BroadcastReceiver registered with Context.registerReceiver() continues to receive these broadcasts while the app is running.
public class MainActivity extends Activity {
private NetChangeReceiver netChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
netChangeReceiver = new NetChangeReceiver();
registerReceiver(netChangeReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(netChangeReceiver);
}
}
2. 提供了一种更稳定的方式
Monitoring Network Connectivity While the App is Running
Apps that are running can still listen for CONNECTIVITY_CHANGE with a registered BroadcastReceiver. However, the ConnectivityManager API provides a more robust method to request a callback only when specified network conditions are met.
NetworkRequest objects define the parameters of the network callback in terms of NetworkCapabilities. You create NetworkRequest objects with the NetworkRequest.Builder class. registerNetworkCallback() then passes the NetworkRequest object to the system. When the network conditions are met, the app receives a callback to execute the onAvailable() method defined in its ConnectivityManager.NetworkCallback class.
The app continues to receive callbacks until either the app exits or it calls unregisterNetworkCallback().
public class MainActivity extends Activity {
private ConnectivityManager.NetworkCallback networkCallback;
private ConnectivityManager connectivityManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request, networkCallback);
}
@Override
protected void onDestroy() {
super.onDestroy();
connectivityManager.unregisterNetworkCallback(networkCallback);
}
private class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Toast.makeText(getBaseContext(), "onAvailable", Toast.LENGTH_SHORT).show();
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Toast.makeText(getBaseContext(), "onLosing", Toast.LENGTH_SHORT).show();
}
@Override
public void onLost(Network network) {
super.onLost(network);
Toast.makeText(getBaseContext(), "onLost", Toast.LENGTH_SHORT).show();
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
Toast.makeText(getBaseContext(), "onCapabilitiesChanged", Toast.LENGTH_SHORT).show();
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Toast.makeText(getBaseContext(), "onLinkPropertiesChanged", Toast.LENGTH_SHORT).show();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章:

Mysql列类型-数值型
2019独角兽企业重金招聘Python工程师标准>>> 一、整数型: 1、取值范围: tinyint smallint mediumint int bigint 分别占用1、2、3、4、8个字节的存储空间 如:tinyint占用1个字节空间,它的取值范围&…

2018.10.22-dtoi1443奶牛逃亡(cowrun)
题目描述: Farmer John忘记修复他农场篱笆上的一个大洞,以至于篱笆围着的N(1< N <1,000)只奶牛从大洞中逃脱出来,并在农场里横冲直撞。每头在篱笆外的奶牛每分钟都将给他带来一美元的损失。FJ必须遍及每头奶牛、…

[转载]Linux 线程实现机制分析
自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性、效率。本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待…
Java12和Jdk12安装以及OpenJdk12源码
文档: JDK 12文档:https://docs.oracle.com/en/java/javase/12/ 下载: OracleJDK12下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html csdn上我下好的,速度较快:https…
android 获取视频大小,Android 获取视频缩略图(获取视频每帧数据)的优化方案
速度对比左边的图片是通过方式1右边的图片是通过方式2speed.gif速度优化,效果拔群。在缩小2倍的Bitmap输出情况下使用MediaMetadataRetriever 抽帧的速度,每帧稳定在 300ms左右。使用MediaCodecImageReader 第一次抽帧。大概是200ms ,后续每帧则是50ms左…

Msql的DML、DDL、DCL的区别
DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language):主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的…
JSR 133 Java内存模型以及并发编程的最权威论文汇总
Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.org/en/jsr/detail?id133 JSR:Java规范请求所有JSR的列表:https://jcp.org/en/jsr/…

ajax实现自动刷新页面实例
html部分:<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>ajax实现自动刷新</title> </head> <body onLoad"Autofresh()"> <p>现在的时间是:…

android aliasactivity作用,android activity-alias 的作用
activity-alias是android里为了重复使用Activity而设计的。当在Activity的onCreate()方法里,执行getIntent().getComponent().getClassName();得到的可能不是这个Activity的名字,有可能是别名的名字,例如:在AndroidMenifest.xml有…

1024 程序员节 | 请对身边的程序猿好一点
程序员节起源程序员的工作我们都知道,编程嘛。但为什么程序员节要在1024呢?1024最早火起来是因为一个“不可描述”的论坛,那里的回帖机制是:新用户发过贴之后,过1024秒才能发一贴,如果没到1024秒就又发了一…

stackoverflow上一个最会举例子的专家
https://stackoverflow.com/ Premraj是stackoverflow上一个一个最会举例子的专家,我特意收集了他的一些有趣的举例: Java弱引用最精彩的解释 https://stackoverflow.com/questions/299659/whats-the-difference-between-softreference-and-weakrefere…

Java中的两个关键字——super、this
Java中的两个关键字——super、this 神话丿小王子的博客主页 一、super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 super可用于调用父类中定义的成员方法 super可用于在子类构造器中调用父类的构造器 使…

android system window,Android控件的fitSystemWindows属性
官方描述:根据系统窗体里的元素比如状态栏来调整View的布局。如果被设为true,控件的padding将会被调整为顶部留出一个statusBar的空间。类似于伪代码paddingTop"statusBarHeight"。重点说明:当布局内容可以延伸到状态栏,…

Nestjs OpenAPI(Swagger)
官方文档 用来描述api 转载于:https://www.cnblogs.com/ajanuw/p/9846589.html

Jdk11,Jdk12的低延迟垃圾收集器ZGC
https://wiki.openjdk.java.net/display/zgc/Main Z垃圾收集器,也称为ZGC,是一种可扩展的低延迟垃圾收集器,旨在实现以下目标: 暂停时间不超过10毫秒暂停时间不会随堆或实时设置大小而增加处理堆范围从几百M到几T字节大小 一目了…

Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...
《Android项目驱动式开发教程》第一章开发入门1.4 项目框架分析 4 android:versionName"1.0" > 5 8 第9行代码android:icon用来声明整个APP的图标,图片一般都放在drawable文件夹下,使用资源引用的方式。 第10行代码android:label用来声明整…
getLocationInWindow getLocationOnScreen getLeft , getTop, getBottom,getRight
版权声明:本文为博主原创文章,未经博主允许不得转载。 最近做项目时,发现在activity的onCreate()和onResume()方法里调用View.getLocationInWindow() 时,View.getLocationInWindow()返回空值,觉得很奇怪,因…

使用reflector对.NET反编译
reflector的下载地址:https://www.cr173.com/soft/355285.html 反编译后的结果: 转载于:https://www.cnblogs.com/ZaraNet/p/9848355.html

协程和Java实现
多线程的性能问题: 1.同步锁。 2.线程阻塞状态和可运行状态之间的切换。 3.线程上下文的切换。 协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。 协程&a…

LoadRunner 技巧之 手动关联与预关联
上一节介绍了关联的原理与自动关联,除了自动关联还有另外两种关联方式:手动关联与 预关联。 手动关联 如果脚本很长,那么我们想找到一…

android app文档,android App项目需求描述文档.docx
本app是给外卖配送员用的,系统后台根据一定的逻辑生成或者建立运单,本App读到后台的运单讲外卖送到定外卖的手中本文档所需详细资料请到/s/1jGGgtLG下载与后台交互的地方不用实现,有数据显示的自己把交互函数写好 返回的测试数据写在交互函数…
如何利用微信小游戏的分包加载机制突破4M代码包体积限制
相信大家度过了一个不错的端午假期,在端午前夕,即6月15日晚上,微信小游戏宣布支持分包加载功能,白鹭引擎在端午节后第一天正式支持分包加载机制。在正式向开发者介绍如何使用前,我先为各位解读一下我对微信提供这个 AP…

一个会画图的工程师
发现小谢图画的很好,虽然有些也是他引用的,但是我觉得还是很好所以这里收集下。 【RocketMQ源码学习】2-Namesrv 3-Remoting模块 rocketmq-remoting 模块是 RocketMQ 中负责网络通信的模块,被其他所有需要网络通信的模块依赖。它是基于 Net…

2016百度实习编程题:括号序列
不知如何解决 1.感觉贪心或者动态规划,不知道如何解决 2.做过生成合法括号序列的题目,想到用DFS补成合法的括号,然而没有成功

html动画怎么隐藏,JQuery操作div隐藏和显示的4种动画
Jquery-Div动画显示body{font-family:"宋体";font-size:13px;color:#415973;}#ShowDiv{display:none;width:300px;height:100px;border:1px solid #ccc;border-right:2px solid #888;border-bottom:2px solid #888;background-color:#f9f9f9;text-align:center;paddi…

@芥末的糖----------《后端加密》
bcryptsession 生命周期 session 标识产生的时机和清除时机:(权限验证) 用户已经登录:这个唯一标识会在用户登录时产生,用户点击退出时或者关闭浏览器时清除。 …
Java中的ClassLoader和SPI机制
深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作。 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextCl…

html在线缓存视频,javascript – 如何为HTML视频添加缓冲
给你的视频提供ID:用于缓冲:var vid document.getElementById("myVideoOne");alert("Start: " vid.buffered.start(0) " End: " vid.buffered.end(0));var vid document.getElementById("myVideoTwo");aler…
ComponentName(String pkg, String cls)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/51279606 开发中因为改项目包名,用了全局替换,误操作把改构造函数的第二个参数只写了类名,不是完整的全路径…

mysql干货——数据库字符集和校对规则详解
2019独角兽企业重金招聘Python工程师标准>>> 一、什么是字符集 字符是多个文字和符号的总称,包括各个国家的文字、标点符号、图形符号、数字等。字符集多个字符的集合。 字符集合种类较多,每个字符集包含的字符的个数不同。对于字符集不支持的…