Android:日常学习笔记(9)———探究广播机制
Android:日常学习笔记(9)———探究广播机制
引入广播机制
Andorid广播机制
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent
传递给 sendBroadcast()
、sendOrderedBroadcast()
或 sendStickyBroadcast()
,您可以将广播传递给其他应用。
Android提供了一套完整的API,允许应用程序自由地发送和接受广播。发送广播使用Intent,接受广播使用 广播接收器(Boradcast Receiver)。
广播分成两种类型:
- 标准广播:一种完全异步的广播,在广播发出之后,所有的广播接收器几乎同时收到这条广播信息。
- 有序广播:一种同步执行的广播,在广播发出之后,所有的接收器根据先后顺序依次收到,并且可以被截获。
接受系统广播
广播接收器可以自由地对自己感兴趣的广播进行注册,这样当相应的广播发出时,广播接收器就可以收到这条广播,并在内部处理逻辑。
动态注册:在代码中注册
创建广播接收器的步骤:
1.新建一个类使其继承BroadcastReceiver
2.重写onReceive()方法
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"network changes",Toast.LENGTH_LONG).show();
}
}3.为接受器绑定要接受的广播
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter;
/*
Structured description of Intent values to be matched. An IntentFilter can match against actions, categories, and data (either via its type, scheme, and/or path) in an Intent. It also includes a "priority" value which is used to order multiple matching filters.
*/
private MyBroadCastReceiver myReceiver; @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
myReceiver = new MyBroadCastReceiver();
registerReceiver(myReceiver,intentFilter);
//注册 } @Override
protected void onDestroy() {
unregisterReceiver(myReceiver);
//动态注册的广播一定要取消注册才行
super.onDestroy();
}
获取精确的网络状态:
1.修改接收器代码
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//这是一个系统服务类,专门用于管理网络连接
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isAvailable())
{
Toast.makeText(context,"获得网络连接",Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(context,"失去网络连接",Toast.LENGTH_LONG).show(); } }
}3.声明程序权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.zy.dealhelper">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
.....
</application> </manifest>说明:涉及用户隐私的状态信息必须要到AndroidManifest.xml中进行声明
静态注册:在AndroidManifest.xml中进行声明
说明:静态注册最大的特点就是程序未启用的情况下便可接受到广播。
使用AS自动生成广播接收器
1.新建一个广播接收器
2.配置广播接收器
public class BootCompleteReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
}
}3.手动注册
发送自定义广播
发送标准广播
1.首先定义了自己的广播接收器并且配置了广播名
public class MyReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到我自己发送的广播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
} }
<receiver
android:name=".broadcast.MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.expample.zy.MY_BROADCAST"></action>
</intent-filter>
</receiver>
2.发送广播
Intent broadCastIntent = new Intent("com.example.zy.MY_BROADCAST");
broadCastIntent.putExtra("info","你好啊");
sendBroadcast(broadCastIntent);
发送有序广播
0.设置接收器的优先等级
<intent-filter android:priority="100">
<action android:name="com.example.zy.MY_BROADCAST"></action>
</intent-filter>
1.发送有序广播
sendOrderedBroadcast(intent,null);
2.截获
public class MyReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到我自己发送的广播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
使用本地广播
为什么使用本地广播?
前面我们接收和发送的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收到来自其他应用程序的广播,这样就容易引起安全性问题。为此Android引入了一套本地广播机制,使用这个机制发出的广播仅仅能在应用程序内部进行传递。
实例
public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager;
private IntentFilter intentFilter;
private MyBroadCastReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//1.获取本地管理器实例
setContentView(R.layout.activity_main); intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyBroadCastReceiver();
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
//2.使用本地广播管理器进行动态注册 });
} @Override
protected void onDestroy() {
localBroadcastManager.unregisterReceiver(myReceiver);
//3.使用本地广播管理器动态卸载
super.onDestroy();
}
}
Android:日常学习笔记(9)———探究广播机制的更多相关文章
- Android:日常学习笔记(5)——探究活动(2)
Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...
- Android:日常学习笔记(9)———探究持久化技术
Android:日常学习笔记(9)———探究持久化技术 引入持久化技术 什么是持久化技术 持久化技术就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失 ...
- Android:日常学习笔记(8)———探究UI开发(5)
Android:日常学习笔记(8)———探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...
- Android:日常学习笔记(7)———探究UI开发(4)
Android:日常学习笔记(7)———探究UI开发(4) UI概述 View 和 ViewGrou Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成 ...
- Android:日常学习笔记(8)———探究UI开发(3)
Android:日常学习笔记(8)———探究UI开发(3) 详解四种基本布局 前言 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 ...
- Android:日常学习笔记(8)———探究UI开发(2)
Android:日常学习笔记(8)———探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...
- Android:日常学习笔记(7)———探究UI开发(1)
Android:日常学习笔记(7)———探究UI开发(1) 常用控件的使用方法 TextView 说明:TextView是安卓中最为简单的一个控件,常用来在界面上显示一段文本信息. 代码: <T ...
- Android:日常学习笔记(6)——探究活动(4)
Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
随机推荐
- Jetty锁定文件的问题
在windows系统上,jetty默认在运行时会锁定部署的文件.这对于需要在程序运行期间动态生成或改动某些文件就变得不能执行!对于这一点,Jetty的官网上专门有文章进行了解释:http://docs ...
- 5.25思考双向绑定为什么容易接收js的方式
一直在考虑为什么html上面的双向绑定好像比winform上面的好用. 那是因为html可以输入任意的东西,不会有问题.而winform不行.这样导致了.html可以比较直观的处理这类需求. 举个例子 ...
- IDEA中maven打包跳过Junit Test
运行MVN install时需要跳过Junit的test cases,可以采用下面的方法: mvn install -DskipTests 或者mvn install -Dmaven.test.ski ...
- git忽略已经被提交的文件,以及如何恢复追踪
问题描述 之前在提交代码时,.gitignore 没有填写完整,导致idea编辑器的配置文件夹.idea被提交了 然后每次运行本地项目,都会在.idea文件夹下生成一堆文件,这时发现问题,将.idea ...
- Spring4 MVC ContentNegotiatingViewResolver多种输出格式实例
本文演示支持多种输出格式,这里 Spring4 MVC应用程序使用了 Spring ContentNegotiatingViewResolver .我们将生成应用程序输出XML,JSON,PDF,XL ...
- 问题解决 —— Http Status 500
在完成JavaWeb项目的过程中经常会出现这种错误 500:指的是服务器内部错误 通常遇到这种情况,我会去看控制台的信息,那里肯定会有提示,空指针(值没有传过去),或者java.sql.SQLExce ...
- Mysql中查看每个IP的连接数
) as ip , count(*) from information_schema.processlist group by ip;
- java FTP 上传下载删除文件
在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...
- C++11写算法之插入排序
插入排序,是指将从1 –> size-1的数一个个插入到前面已经排序好的数组中. 时间复杂度:O(n^2) , O(nlgn) (lgn指使用二分查找插入点位置) 空间复杂度:O(1) // ...
- windows 下XAMPP 使用Nginx替代apache作为服务器
说实话, 在windows下使用Nginx 着实有点不太方便, 但因项目需求, 又不想换系统(虽然可以搞个虚拟机玩), 只能用Nginx了 好了, 不多说了. 开始... 首先我用的是xampp包(A ...