导图社区 电子通讯广播机制知识框架笔记
电子通讯广播机制知识框架笔记:联网广播接收者:获得联网管理者和网络信息实体:context.getSystemService(Context.CONNECTIVITY_SERVICE)。
编辑于2022-11-10 17:53:54 广东电子通讯广播机制知识框架笔记
广播
现实
收听收音机
广播电台
广播机制
异步机制
避免组件之间互相等待
冲突
死锁
简化应用层的编程
订阅-发布
生命周期
onReceive方法的执行过程,最长10秒
ANR错误
耗时操作
广播接收者生命周期短,
可能运行结束成为空进程,有可能被杀死
(广播和子线程一起死)
启动服务运行子线程耗时操作
注册广播特点
静态的常驻型
程序退出
仍可以激活目标组件
显示意图或者隐式意图激活
动态的非常驻型
程序退出
无法激活
只能使用隐式意图
动态注册时指定了隐式意图过滤器
Android
电池的使用状态
电话的接收
短信的接收
发送广播
发送
new Intent()对象设置意图
sendBroadcast(inetnt)
分类
正常广播
对内完全异步
对外无序平等
Context.sendBroadcast()
有序广播
优先级高的可以先接受到广播
-1000—1000
priority默认0
优先级高终止广播
BroadCastReceiver.abortBroadcast
代码
1、设置好intent的数据
Intent intent=new Intent();
intent.setAction("android.intent.action.one");
intent.putExtra("name", "one");
2、发送有序广播
this.sendOrderedBroadcast()
intent,
intent,null,broadcastReceiverOnenull, 0, null, null);
必须收到
3、注册priority
粘滞广播
长期停留
context.sendStickyBroadcast(intent);
需要xml注册权限
android.permission.BROADCAST_STICKY
MAinActivity
onResume()
注册
filter.addAction("android.intent.action.one");
filter=new IntentFilter();
this.registerReceiver(broadcastReceiverOne, filter);
onPause()
取消注册
this.unregisterReceiver(broadcastReceiverOne);
发送广播
this.sendStickyBroadcast(intent);
广播接收者
接收
功能清单注册一个和接受广播的对象
action相同
java中动态注册
registerReceiver()动态注册非常驻型
自定义广播接收者步骤
步骤
1.编写一个类继承BroadcastReceiver并重写onReceive
2、注册
功能清单文件
静态的常驻型
java代码进行动态的非常驻型广播
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.one");
this.registerReceiver(broadcastReceiverOne, filter);
代码
1、继承BroadcastReceiver
class BroadcastReceiverOne extends BroadcastReceiver
2、重写onReceive()
void onReceive(Context context, Intent intent) {
3、获得数据
String action=intent.getAction();
String name=intent.getStringExtra("name");
4、注册
联网广播接收者
1、获得联网管理者和网络信息实体
(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo=
connectivityManager.getActiveNetworkInfo();
2、判断是否联网
if(networkInfo!=null && networkInfo.isConnected()){
int type=networkInfo.getType();
//得到网络类型
if(type==ConnectivityManager.TYPE_WIFI){
Toast.makeText(context, "当前是WIFI网络!", Toast.LENGTH_LONG).show();
}else if(type==ConnectivityManager.TYPE_MOBILE){
Toast.makeText(context, "当前是3G网络!", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context, "当前网络未知!", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context, "当前无网络!", Toast.LENGTH_LONG).show();
3、注册检查网络权限、广播接收者
android.permission.ACCESS_NETWORK_STATE
拦截手机短信
声明当前手机收到短信时发送广播的action
final String action=
"android.provider.Telephony.SMS_RECEIVED"
1、判断是系统收到短信;
if(intent.getAction().equals(action)){
2、不再往下传播
this.abortBroadcast();
3、获取意图携带的信息
Bundle bundle=intent.getExtras();
if (bundle != null) {
4、通过pdus获得接收到的所有短信消息,获取短信内容;
Object[] pdus = (Object[]) bundle.get("pdus");
协议数据单元pdus
遍历信息数组
for(Object obj:pdus){
5、获取单条短信内容,以pdu格式存,并生成短信对象
SmsMessage smsMessage=SmsMessage.createFromPdu(buffer);
6、根据信息对象获得具体的内容元素
手机号码
String address=smsMessage.getOriginatingAddress();
短信内容
String body=smsMessage.getMessageBody();
接收时间
long l=smsMessage.getTimestampMillis();
转化时间格式
Date date=new Date(l);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate=simpleDateFormat.format(date);
7、得到短信管理器对象,并发送信息
SmsManager smsManager=SmsManager.getDefault();
smsManager.sendTextMessage(
(address,null,"ok",null,null)
8、注册接收、发送短信权限、广播接收器
android.permission.RECEIVE_SMS
android.permission.SEND_SMS
拦截外拨电话
1、继承BroadcastReceiver
2、定义外拨电话action
private String action
"android.intent.action.NEW_OUTGOING_CALL
3、判断用户进行外拨电话
if(intent.getAction().equals(action)){
4、获得电话号码
String number=this.getResultData();
5、获得电话号码,并决定是否质空拦截
if("5556".equals(number)){
this.setResultData(null);
6、外拨电话的权限
uses-permission
android.permission.PROCESS_OUTGOING_CALLS
action
android.intent.action.NEW_OUTGOING_CALL