Android 接收系统广播(动态和静态)
1、标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播信息,它们之间没有先后顺序。效率高、无法被截断。
2、有序广播:是一种同步执行的广播,在广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。
这种广播有先后顺序,优先级高的广播接收器就可以先接收到广播,并且前面的广播接收器可以截断正在传播的广播。
3、动态注册广播:在主代码中直接注册。
4、创建广播接收器:新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法。有广播到来时,onReceive()方法中就会得到执行,具体逻辑就写在这个方法中。
5、在onCreate()方法中使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 方法进行动态注册,第一个参数传入创建的类的实例,第二个参数传入IntentFilter的实例。
6、下面的代码实现网络状态的监听:
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.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //action中的值是要监听的系统广播
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter); //用registerReceiver()方法进行注册,分别传入自定义类的实例和意图实例
}
//动态注册的广播接收器一定要取消注册,使用unregisterReceiver()方法取消注册
protected void onDestory(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
//自定义一个类继承自BroadcastReceiver,并重写他的onReceive()方法
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
}
}
}
7、最后要在AndroidManifest.xml中声明权限,否则程序会直接崩溃。注意:中间那行才是申请权限,
package="example.com.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application> </application>
8、模拟器的API要大于等于24才能运行以上代码。仔细、仔细、仔细!!!!千万不要写错单词
9、静态注册广播:在AndroidManifest中注册,不必启动程序就能实现接收广播。
10、以下代码实现接收开机广播:在包名上右键,New—Other—Broadcast Receiver,更改广播接收器的名字,勾选Exported和Enabled。这两个属性分别代表广播接收器接收本程序意外的广播和是否启用这个广播接收器。
package example.com.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class BootCompleteReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
}
}
<!--应用可以监听该广播,成为自启动权限,但是会拖慢开机速度-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 。。。。。。。。。。。 <receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<!--由于系统启动后会发出一条值为"android.intent.action.BOOT_COMPLETED"的广播,所以在下面的标签中添加了action-->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
10、onReceive()方法中写需要实现的逻辑,但是不要在这方法中写太多逻辑或者进行任何耗时的操作,因为广播接收器中是不允许开启线程的,当方法中运行了较长时间而没有结束,程序就会报错。
Android 接收系统广播(动态和静态)的更多相关文章
- Android接收系统广播
Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息.比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条 ...
- android: 接收系统广播
Android 内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到 各种系统的状态信息.比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一 条广播,时间或时区发生改变也会发 ...
- Android开发之接收系统广播消息
BroadcastReceiver除了接收用户所发送的广播消息之外.另一个重要的用途:接收系统广播. 假设应用须要在系统特定时刻运行某些操作,就能够通过监听系统广播来实现.Android的大量系统事件 ...
- android接收短信——framework处理流程(android 5.1)
modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...
- Android接收短信
Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...
- android: 接收和发送短信
8.2 接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 A ...
- Android常用系统广播
关于Intent的使用,可参阅前章:http://www.cnblogs.com/caidupingblogs/p/5101669.html //关闭或打开飞行模式时的广播 Intent.ACTION ...
- Android 接收短信
启动程序时启动一个service,在service里注册接收短信的广播,当手机收到短信里,打印出短信内容跟电话号码. package com.lmy.SmsListener; import andro ...
- Android接收wifi路由器发送过来的一组字节数据
1.字节数组转换为字符串 byte[] byBuffer = new byte[20];... ...String strRead = new String(byBuffer);strRead = S ...
随机推荐
- SOA总结(脑图图片)
- eclipse svn 忽略 target目录
这个build失败的解决方案就是不要把你项目的 target目录放在src repository 里面,还有 .project 和 .classpath最好也别放到src repository 里. ...
- Ubuntu编译安装最新的webkit
好久都没更新webkit 源码在ubuntu上编译了,网上搜了一下,基本上都是早期编译的webkit版本.可能是大家都去搞高大上的谷歌浏览器了吧. 今天就以ubuntu14.04版本作为编译环境来讲讲 ...
- [java初探09]__关于java的包装类
前言 在Java语言的学习过程中,我们逐渐的理解了Java面向对象的思想,与类和对象的应用.但是在基本数据类型的使用上,我们无法将其定义为一个对象,通过使用对象的方法来使用它们,但是Java语言的思想 ...
- Nginx 的两种认证方式
简介: 今天来研究一下 Nginx 的两种认证方式. 1.auth_basic 本机认证 2.ngx_http_auth_request_module 第三方认证 一.安装 Nginx shell & ...
- 【Elasticsearch全文搜索引擎实战】之Head插件实践
简介 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...
- MySQL 解压缩版安装 2017-12-02(完整版,包括异常处理)
一.安装 1.到mysql官网 http://dev.mysql.com/downloads/mysql/ 下载mysql 注:msi的是安装版 zip是压缩版 2.解压 解压到想安装的目录下 ...
- JavaWeb学习 (九)————HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- datatable删除行之datatable.Rows[i].Delete()。标记之后行没有了
使用Delete()之后行消失了 先在for循环外加上dt.AcceptChanges(); 删除时在dt.AcceptChanges();
- Task.Run Vs Task.Factory.StartNew 【收藏】
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...