了解BroadcastRecever
广播分类:
标准广播(Normal broadcasts):完全异步执行的广播,接收没有先后顺序,效率高,无法被接收器被拦截。
有序广播(Ordered broadcasts) :同步执行的广播,有先后顺序,广播可以被接收器拦截或修改。
接收系统广播:
动态注册监听网络变化:(只能在程序启动后才能接收到广播,程序结束,广播取消)
1.再activity中注册广播并处理接收后的逻辑
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.com.CONNECTIVITY_CHANGE");
//创建广播接收者
networkChangeReceiver = new NetworkChangeReceiver();
//注册广播接收者
registerReceiver(networkChangeReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
unregisterReceiver(networkChangeReceiver);
}
//自定义广播接收者
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();
}
}
}
}
2.还要添加访问网络状态的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 静态注册实现开机启动:(程序结束后还能正常接收广播)
1.创建广播接收类:
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
}
}
2.在Manifest中静态注册:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
enable:是否启用广播接收器
exported:是否允许接收器接收本程序以外的广播
添加监听启动完成广播权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
发送自定义广播:
发送标准广播:
1.首先定义广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
2.在Manifest中注册:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
3.发送广播:
public void onClick(View v) {
if(v.getId() == R.id.send){
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
}
}
发送有序广播:
1.在注册广播接收器时给intent-filter设置优先级属性,数值越大,优先级越高
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter
android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
2.发送有序广播:
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendOrderedBroadcast(intent,null);//只需要修改发送方法
3.接收到广播时进行拦截或者修改处理:
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();//拦截广播
setResult(int code,Stirng data, Bundle extras);//修改结果传递给下一个广播
//获取上一个广播传来的数据
getResultCode();
getResultData();
getResultExtras(boolean makeMap);
}
}
4.终结广播(不管是否拦截,都会最终执行)
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendOrderedBroadcast(intent,null,new BootCompleteReceiver(),new Handler(),0,null,null);
使用本地广播:
本地广播只能在应用内部传递
1.创建广播接收器
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
}
2.获取本地广播管理类:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
3.注册广播接收器
localBroadcastManager.registerReceiver(networkChangeReceiver,intentFilter);
4.发送广播:
localBroadcastManager.sendBroadcast(intent);
5.注销广播
localBroadcastManager.unregisterReceiver(networkChangeReceiver);
了解BroadcastRecever的更多相关文章
- android获取周围AP信息(下)
疑问: 在上一篇中,还有一个问题未解决:WifiManager的startscan() 方法是立即返回的,也就是说这个方法会调用一个扫描wifi信号的线程,那么这个扫描什么时候结束呢?我们又该什么时候 ...
随机推荐
- Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good
QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...
- scala 伴生对象与伴生类
package cn.scala_base.oop.scalaobject import java.security.cert.Extension /** * object的构造器必须是无参的,且且构 ...
- SharePoint 2010/2013 隐藏的速度下拉菜单列表项
SharePoint 2010/2013 隐藏的速度下拉菜单列表项 有时为了防止一些用户编辑列表项.需要隐藏下拉菜单列表项.,仅仅须要添加一个内容编辑器控件,将css代码写入其HTML ...
- 探究Promise的实现
最终答案在一个类库里,地址 https://github.com/yahoo/ypromise 这个类库也有问题,就是下面这道面试题在IE9里实现不一致,类库里还是用了setTimeout.去年尝试用 ...
- PCI GXL学习之二次开发篇
作者:朱金灿 来源:http://blog.csdn.net/clever101 gxl的二次开发分初级和高级之分.初级是gxl提供了几百个模块供你编排成不同的作业.高级就是你可以编写你的算法模块,然 ...
- 1.跟着微软 https://docs.microsoft.com/zh-cn/dotnet/core/ 学习.net core
10分钟快速使用 安装之后 打开cmd 第一步. dotnet new console -o firstApp 第二步. cd firstApp 第三部.dotnet run 这样就运行了hello ...
- 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush) >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...
- WPF(C#)中Bitmap与BitmapImage相互转换
原文:WPF(C#)中Bitmap与BitmapImage相互转换 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/art ...
- 极简代码(七)—— SNR
10⋅log10∑x=1Nx∑y=1Nyf2(x,y)∑x=1Nx∑y=1Ny(f(x,y)−f^(x,y))2 这里不妨先用 matlab 所支持的函数对象(函数式编程)定义这样一个函数变量,可作为 ...
- Mac OS X通过结合80port
Mac OS X 由于要绑定80port须要ROOT权限, 可是假设用root权限启动eclipse或tomcat又会造成, 启动创建的各类文件是root的,普通用户无法删除. 为此. 我们能够通过p ...