Android:BroadcastReceiver
- 动态广播
- 在代码中注册receiver
- 一定要手动在onDestroy()时调用unregisterReveiver()来取消注册
- 静态广播
- 在AndroidManifest.xml中注册receiver(主要是设定action)
public class MainActivity extends Activity {
private NetworkChangeReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
receiver = new NetworkChangeReceiver();
registerReceiver(receiver, intentFilter);
}
@Override
protected void onDestroy() {
unregisterReceiver(receiver);//remember to unregister manually
super.onDestroy();
}
}
2. 定义receiver的行为:继承BroadcastReceiver并在覆写onReceiver()时定义好接收到广播时处理的逻辑:
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.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();
}
}
3. 在AndroidManifest.xml中定义必要的权限,主要<uses-permission>标签位于<manifest>的下一级,即与<application>同级:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot complete.", Toast.LENGTH_LONG).show();
}
}
2. 在AndroidManifest.xml中定义receiver(与<activity>同级,<application>的子元素):
<receiver android:name=".MyBroadcast">
<intent-filter android:priority="100">
<action android:name="com.scv.lawrence.MY_BROADCAST"/>
</intent-filter>
</receiver>
3. 在AndroidManifest.xml中添加相应权限(<application>同级,<manifest>的子元素):
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 标准(Normal broadcast)
- 默认的广播方式,即broadcast发出后,所有receiver几乎在同时接收到。
- 有序(Ordered broadcast)
- receiver根据设定的优先级(priority)来决定broadcast的传递顺序,较高优先级的receiver可以选择拦截该broadcast阻止其向后传播
- 二者区别
- 发送广播时,标准广播调用的是sendBroadcast(),有序广播调用的是sendOrderedBroadcast()
- 接收广播时(在AndroidManifest.xml中注册receiver),标准广播不用在<intent-filter>中设置android:priority属性,有序广播则需要设定一个整数,数值越大priority越高
在代码中发送自定义的标准/无序广播:
Button sendBroadcast = (Button) findViewById(R.id.broadcast);
sendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.scv.lawrence.MY_BROADCAST");
sendBroadcast(intent);
// sendOrderedBroadcast(intent, null);
}
});
在AndroidManifest.xml中定义(父元素为<application>,即与<activity>同级):
<receiver android:name=".MyBroadcast">
<intent-filter android:priority="100">
<action android:name="com.scv.lawrence.MY_BROADCAST"/>
</intent-filter>
</receiver>
- 全局广播
- 非LocalBroadcastManager进行发送或接收的广播即为全局广播
- 本地广播
- 发送/接收的broadcast只限于当前app范围内,安全性比全局高
- 与全局广播的区别在于本地广播依靠LocalBroadcastManager进行注册、发送及注销receiver
public class LocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Get the local broadcast.", Toast.LENGTH_SHORT).show();
}
}
2. 和动态广播差不多,区别主要在使用LocalBroadcastManager的实例来进行操作:
public class MainActivity extends Activity {
private LocalBroadcastManager localBroadcastManager;
private LocalBroadcastReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Local Broadcast
localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
final Button localBroadcast = (Button) findViewById(R.id.local_broadcast);
localBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.scv.lawrence.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
IntentFilter localIntentFilter = new IntentFilter();
localIntentFilter.addAction("com.scv.lawrence.LOCAL_BROADCAST");
localReceiver = new LocalBroadcastReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentFilter);
}
@Override
protected void onDestroy() {
localBroadcastManager.unregisterReceiver(localReceiver);
super.onDestroy();
}
}
3. 在AndroidManifest.xml中配置permission. (如有必要)
Android:BroadcastReceiver的更多相关文章
- Android四大组件之一:BroadCastReceiver(广播接收者)
广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...
- Android(java)学习笔记177:BroadcastReceiver之 应用程序安装和卸载 的广播接收者
国内的主流网络公司(比如网易.腾讯.百度等等),他们往往采用数据挖掘技术获取用户使用信息,从而采用靶向营销.比如电脑上,我们浏览网页的时候,往往会发现网页上会出现我们之前经常浏览内容的商 ...
- Android(java)学习笔记176:BroadcastReceiver之 短信发送的广播接收者
有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和 activity_main. ...
- Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者
首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...
- Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册
1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...
- Android(java)学习笔记179:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)
之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者 ...
- Android(java)学习笔记178:BroadcastReceiver之 自定义广播
广播使用: 电台:对外发送信号.---------电台发送广播(可以自定义) 收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...
- Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)
之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...
- Android(java)学习笔记121:BroadcastReceiver之 自定义广播
广播使用: 电台:对外发送信号.---------电台发送广播(可以自定义) 收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...
随机推荐
- 从0开始 数据结构 AC自动机 模板(from kkke)
AC自动机模板 2.4.1 头文件&宏&全局变量 #include <queue> #define MAXN 666666 #define MAXK 26//字符数量 st ...
- PAT1075. PAT Judge (25)
其中在排名输出上参照了 http://blog.csdn.net/xyzchenzd/article/details/27074665,原先自己写的很繁琐,而且还有一个测试点不通过. #include ...
- JavaScript的动态特性(通过eval,call,apply和bind来体现)
JavaScript的动态特性(通过eval,call,apply和bind来体现) JavaScript是一种基于面向对象的.函数式的.动态的编程语言.现在发展到已经可以用在浏览器和服务器端了. 这 ...
- Asp.Net MVC 缓存设计
Asp.Net MVC 缓存: 1. 可以直接在Controller,Action上面定义输出缓存OutputCache,如下,第一次请求这个Index的时候,里面的代码会执行,并且结果会被缓存起来, ...
- 安装GoMap
参考:https://github.com/ehrudxo/GoMap 1.依赖go包安装 gorm包安装 直接在github首页搜索gorm,找到对应的gorm包: 然后打开本机cmd命令行窗口,切 ...
- 我的nlp之路(1)
1/8日任务 基础篇: 如何使用远程连接从windows或者linux连到服务器进行操作(切换用户,传递文件) (严禁使用root账户) Linux基本bash命令 a) 查看文件大小, ...
- poj 2255 Tree Recovery 分治
Tree Recovery Description Little Valentine liked playing with binary trees very much. Her favorite g ...
- FlashFXP客户端 FTP连接,连接很慢的情况,
菜单栏-->站点-->站点管理器--->左边视图FTP--->列表命令选择 STAT -L
- apollo stomp client 代码示例
0.环境准备 0.1.linux 0.2.java 0.3.下载apollo二进制包,解压 0.4.创建broker,名字为 userlog {APOLLO_HOME}/bin/apollo crea ...
- [spring]xml配置文件中的"classpath:"与"classpath*:"的区别
<bean id="sessionFactorySaas" class="org.mybatis.spring.SqlSessionFactoryBean" ...