广播BroadCastReceiver

广播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"/>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值