了解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信号的线程,那么这个扫描什么时候结束呢?我们又该什么时候 ...
随机推荐
- PCI的imagework已由freeview软件代替
作者:朱金灿 来源:http://blog.csdn.net/clever101 在PCI 9.1中重要模块集成显示环境imagework还存在,但是到了PCI 10.0中imagework已经消失了 ...
- JVM调优之Tomcat启动参数配置及详解
开发项目中会遇到Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的问题,通过查找资料找到是通过设置Tomcat 启动堆空间大小.年轻代大小.每 ...
- 怎样获取android手机联系人并按字母展示(三)
假设获取contact的头像信息并展示: 怎样依据photoId来获取bitmap: public static Bitmap getContactPhoto(Context context, lon ...
- 调用cordova相关插件进行消息推送(通知栏提醒、响铃、震动)
原文:调用cordova相关插件进行消息推送(通知栏提醒.响铃.震动) 版权声明:本文为博主原创文章,转载须注明出处,博客地址:https://blog.csdn.net/wx13227855087 ...
- 云主机启动Node服务后,关闭控制台,无法访问的问题
之前一直用node app.js操作,开启服务后,关闭控制台,仍然可以正常访问我的网站.但昨晚新买腾讯云的服务器后,发现关闭控制台后,就无法访问网站了.然后给腾讯云发了个工单.腾讯云的工程师给了一篇技 ...
- React事件处理函数传参问题
React事件处理函数参数 HTML标签与React 组件是不同的,事件对象e是HTML标签元素的,组件没有的.
- matlab 高级函数 —— circshift、squeeze
circshift:顾名思义,循环移动,循环的意义在于,移出的数据不丢失,而是来到队列的首部位置,也即其实是将原始序列视为一种圆环. 1. 基本用法 默认为右移. Y = circshift(A,K) ...
- 华为软件开发云(DevCloud):免费可商用的项目管理工具
在软件开发技术和理念层出不穷的今天,如何更快的适应变化的环境,更好的满足客户的需求,已经成为决定从小到大各种规模企业能否活下去的关键. 天下武功唯快不破,在当今大环境中更是如此,微服务,敏捷开发,新的 ...
- OpenGL(二十一) glPolygonOffset设置深度偏移解决z-fighting闪烁问题
开启深度测试后OpenGL就不会再去绘制模型被遮挡的部分,这样实现的显示画面更为真实,但是由于深度缓冲区精度的限制,对于深度相差非常小的情况(例如在同一平面上进行两次绘制),OpenGL就不能正确判定 ...
- Git撤销对远程仓库的push&commit提交
撤销push 1. 执行 git log查看日志,获取需要回退的版本号 2. 执行 git reset –soft <版本号> ,如 git reset -soft 4f5e9a90ed ...