广播BroadCastReceiver
2017-02-12 19:24
447 查看
广播BroadCastReceiver
BroadcastReceiver:是Android四大组件之一
BroadcastReceiver的名称含义是广播接收者.
BroadcastReceiver的用途:Android系统会发生一些改变,这些变化,系统会用广播的形式,给系统安装的各个软件发送,那么这些软件需要有一种接收系统发出广播内容的组件,用来进行系统广播内容的处理.
注意:软件自身可含有广播接受者,也可以不含有广播接受者
普通的用法
创建类,继承BroadcastReceiver类
重写onReceiver(Context,Intent)方法
注册广播
在AndroidManifest.xml中注册(全局)
<receiver android:name="">
<action android:name="广播频道" />
动态注册(局部):Context.registerReceiver(BroadcastReceiver,IntentFilter)
new IntentFilter("action") 创建时设置广播频道
IntentFilter.addAction("action"); 通过addAction方法增加广播频道
发送广播
Context.sendBroadcast(Intent)
Context.sendBroadcast(Intent,String) 带有权限发送广播
广播的生命周期
onReceiver(Context,Intent)
Toast
NotifyManager
Context.startActivity(Intent)
Context.sendBroadcast
Context.startService
可以在广播中执行的功能
注意事项
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成
有序广播
Context.sendOrderedBroadcast(Intent,String)
BroadcastReceiver.abortBroadcast() 中断广播,使级别低的广播接收器不能接收此广播
声明广播接收级别:android:priority="1000"
IntentFilter.SYSTEM_HIGH_PRIORITY :1000
IntentFilter.SYSTEM_LOW_PRIORITY: -1000
广播的安全性
发送广播时
发送带权限的广播
sendBroadcast(Intent,String)
指定接收广播的应用包名
Intent.setPackage("com.trainmobile.ss")
在AndroidManifest.xml清单中配置
<permisson android:name="" /> 定义权限
<uses-permission android:name=".."> 使用权限
注册接收广播时
Context.registBroadcast(Intent,String),String为接收广播的权限
<receiver androd:exported="false" ..>不接收外部应用的广播
LocalBroadcastManager
所在包:android.support.v4.content
LocalBroadcastManager manager =LocalBroadcastManager.getInstance(Context)
manager.registReceiver(BroadcastReceiver,IntentFilter)
manager.sendBroadcast(Intent)
manager.unregisterReceiver(BroadcastReceiver receiver)
常用的系统广播
注意:系统广播要严格按照官方API的说明方式使用
Intent.ACTION_BOOT_COMPLETED 系统开机启动完成
Intent.ACTION_SHUTDOWN 关机提醒广播
Intent.ACTION_SCREEN_OFF 屏幕被关闭
Intent.ACTION_SCREEN_ON 屏幕已经被打开
Intent.ACTION_USER_PRESENT 屏幕解锁广播
Intent.ACTION_NEW_OUTGOING_CALL 拨号广播,获取电话号码字段Intent.EXTRA_PHONE_NUMBER
Intent.ACTION_BATTERY_LOW 低电量提醒广播
Intent.ACTION_BATTERY_CHANGED 电量发生变化广播
TelephonyManager.ACTION_PHONE_STATE_CHANGED 来电时状态变化广播,TelephonyManager.CALL_STATE_RINGING播出,TelephonyManager.CALL_STATE_OFFHOOK挂断,TelephonyManager.CALL_STATE_IDLE待机,静止
Telephony.Sms.Intents.SMS_RECEIVED_ACTION 接收短信的广播
仅支持代码中注册
网络状态改变的广播
//网络连接的管理器
ConnectivityManager mgr = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = mgr.getActiveNetworkInfo();
if(info!=null&&info.isConnected()){
switch(info.getType()){
case ConnectivityManager.TYPE_MOBILE:
Toast.makeText(context, "移动网络", Toast.LENGTH_SHORT).show();
break;
case ConnectivityManager.TYPE_WIFI:
Toast.makeText(context, "WIFI网络", Toast.LENGTH_SHORT).show();
break;
}
}else
Toast.makeText(context, "没有网络!", Toast.LENGTH_SHORT).show();
}
//清单文件中注册的Action
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
//使用的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
开机提示广播
//清单注册使用的
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.LAUNCHER"/>
//使用的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
拨打接听电话广播
String action = intent.getAction();
if(action.equals(Intent.ACTION_NEW_OUTGOING_CALL)){
String numb = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
System.out.println("====呼出电话:"+numb);
}else{
TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mgr.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
//响铃
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("=====呼入的电话号码:"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("======挂断电话");
break;
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("======待机、静止状态");
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
}
//清单文件中注册使用的
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>//拨打电话
<action android:name="android.intent.action.PHONE_STATE"/>//接听电话
短信广播
Bundle bundle = intent.getExtras();
Object[] object = (Object[]) bundle.get("pdus");
SmsMessage[] msgs=new SmsMessage[object.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i]=SmsMessage.createFromPdu((byte[])object[i]);
}
for (SmsMessage smsMessage : msgs) {
String body = smsMessage.getDisplayMessageBody();
String address = smsMessage.getDisplayOriginatingAddress();
System.out.println("收到短信===========");
System.out.println(body+"==========="+address);
}
//Activity中动态注册
//在onStart()方法中
SMSReceiver receiver=new SMSReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(receiver, filter);
//解除注册
unregisterReceiver(receiver);
//清单文件中使用权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
BroadcastReceiver:是Android四大组件之一
BroadcastReceiver的名称含义是广播接收者.
BroadcastReceiver的用途:Android系统会发生一些改变,这些变化,系统会用广播的形式,给系统安装的各个软件发送,那么这些软件需要有一种接收系统发出广播内容的组件,用来进行系统广播内容的处理.
注意:软件自身可含有广播接受者,也可以不含有广播接受者
普通的用法
创建类,继承BroadcastReceiver类
重写onReceiver(Context,Intent)方法
注册广播
在AndroidManifest.xml中注册(全局)
<receiver android:name="">
<action android:name="广播频道" />
动态注册(局部):Context.registerReceiver(BroadcastReceiver,IntentFilter)
new IntentFilter("action") 创建时设置广播频道
IntentFilter.addAction("action"); 通过addAction方法增加广播频道
发送广播
Context.sendBroadcast(Intent)
Context.sendBroadcast(Intent,String) 带有权限发送广播
广播的生命周期
onReceiver(Context,Intent)
Toast
NotifyManager
Context.startActivity(Intent)
Context.sendBroadcast
Context.startService
可以在广播中执行的功能
注意事项
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成
有序广播
Context.sendOrderedBroadcast(Intent,String)
BroadcastReceiver.abortBroadcast() 中断广播,使级别低的广播接收器不能接收此广播
声明广播接收级别:android:priority="1000"
IntentFilter.SYSTEM_HIGH_PRIORITY :1000
IntentFilter.SYSTEM_LOW_PRIORITY: -1000
广播的安全性
发送广播时
发送带权限的广播
sendBroadcast(Intent,String)
指定接收广播的应用包名
Intent.setPackage("com.trainmobile.ss")
在AndroidManifest.xml清单中配置
<permisson android:name="" /> 定义权限
<uses-permission android:name=".."> 使用权限
注册接收广播时
Context.registBroadcast(Intent,String),String为接收广播的权限
<receiver androd:exported="false" ..>不接收外部应用的广播
LocalBroadcastManager
所在包:android.support.v4.content
LocalBroadcastManager manager =LocalBroadcastManager.getInstance(Context)
manager.registReceiver(BroadcastReceiver,IntentFilter)
manager.sendBroadcast(Intent)
manager.unregisterReceiver(BroadcastReceiver receiver)
常用的系统广播
注意:系统广播要严格按照官方API的说明方式使用
Intent.ACTION_BOOT_COMPLETED 系统开机启动完成
Intent.ACTION_SHUTDOWN 关机提醒广播
Intent.ACTION_SCREEN_OFF 屏幕被关闭
Intent.ACTION_SCREEN_ON 屏幕已经被打开
Intent.ACTION_USER_PRESENT 屏幕解锁广播
Intent.ACTION_NEW_OUTGOING_CALL 拨号广播,获取电话号码字段Intent.EXTRA_PHONE_NUMBER
Intent.ACTION_BATTERY_LOW 低电量提醒广播
Intent.ACTION_BATTERY_CHANGED 电量发生变化广播
TelephonyManager.ACTION_PHONE_STATE_CHANGED 来电时状态变化广播,TelephonyManager.CALL_STATE_RINGING播出,TelephonyManager.CALL_STATE_OFFHOOK挂断,TelephonyManager.CALL_STATE_IDLE待机,静止
Telephony.Sms.Intents.SMS_RECEIVED_ACTION 接收短信的广播
仅支持代码中注册
网络状态改变的广播
//网络连接的管理器
ConnectivityManager mgr = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = mgr.getActiveNetworkInfo();
if(info!=null&&info.isConnected()){
switch(info.getType()){
case ConnectivityManager.TYPE_MOBILE:
Toast.makeText(context, "移动网络", Toast.LENGTH_SHORT).show();
break;
case ConnectivityManager.TYPE_WIFI:
Toast.makeText(context, "WIFI网络", Toast.LENGTH_SHORT).show();
break;
}
}else
Toast.makeText(context, "没有网络!", Toast.LENGTH_SHORT).show();
}
//清单文件中注册的Action
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
//使用的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
开机提示广播
//清单注册使用的
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.LAUNCHER"/>
//使用的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
拨打接听电话广播
String action = intent.getAction();
if(action.equals(Intent.ACTION_NEW_OUTGOING_CALL)){
String numb = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
System.out.println("====呼出电话:"+numb);
}else{
TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mgr.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
//响铃
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("=====呼入的电话号码:"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("======挂断电话");
break;
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("======待机、静止状态");
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
}
//清单文件中注册使用的
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>//拨打电话
<action android:name="android.intent.action.PHONE_STATE"/>//接听电话
短信广播
Bundle bundle = intent.getExtras();
Object[] object = (Object[]) bundle.get("pdus");
SmsMessage[] msgs=new SmsMessage[object.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i]=SmsMessage.createFromPdu((byte[])object[i]);
}
for (SmsMessage smsMessage : msgs) {
String body = smsMessage.getDisplayMessageBody();
String address = smsMessage.getDisplayOriginatingAddress();
System.out.println("收到短信===========");
System.out.println(body+"==========="+address);
}
//Activity中动态注册
//在onStart()方法中
SMSReceiver receiver=new SMSReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(receiver, filter);
//解除注册
unregisterReceiver(receiver);
//清单文件中使用权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
相关文章推荐
- BroadcastReceiver概述 接收系统BroadCast 收箱广播
- BroadcastReceiver学习(02)之有序广播
- android广播接收者BroadcastReceiver
- Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者
- Android学习笔记(十二)BroadcastReceiver的有序广播和优先级
- Android 四大组件之BroadcastReceiver(发送有序无序广播)
- 通过广播接收者(BroadcastReceiver)或守护线程启动服务,录音机监听电话
- Android之BroadcastReceiver讲义并通过广播机制实现短信窃听
- android BroadcastReceiver详细讲解1-自带的广播接受器-拨号、短信、卸载/安装、开机启动
- BroadcastReceiver应用详解——广播
- Android 使用广播(BroadcastReceiver)传递数据
- android的广播broadcast和receiver && 广播接收器优先级的深入分析
- Android 开发笔记三 BroadcastReceiver 广播接收者
- Android基础(九) BroadcastReceiver 广播接收者
- 广播(BroadcastReceiver)
- android四大组件之广播接收者(BroadcastReceiver)
- Broadcast(广播)和BroadcastReceiver(广播接收器)
- Android开发——四大组件BroadcastReceiver实例广播事件的拦截转发
- Androidc学习笔记三之BroadcastReceiver广播接收器及单双页模式
- BroadcastReceiver(广播接收器 )