Android基础07广播.docx
- 文档编号:4232974
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:18
- 大小:347.27KB
Android基础07广播.docx
《Android基础07广播.docx》由会员分享,可在线阅读,更多相关《Android基础07广播.docx(18页珍藏版)》请在冰豆网上搜索。
Android基础07广播
Android课程同步笔记
Alpha0.01版
-编程,始于黑马
Android-BroadcastReceiver
1.BroadcastReceiver简介(★★★★)
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播Intent的,广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。
通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
1.1实现一个BroadcastReceiver
需求:
定义一个广播接收器,用于接收SDCard移除时发送的广播。
创建一个新的Android工程《广播接收器》,包名:
com.itheima.broadcastReciver。
在src目录下新建一个SDCardUnmountedReceiver类继承BroadcastReceiver类,覆写onReceive方法,代码清单如下:
publicclassSDCardUnmountedReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Toast.makeText(context,"SDCard已经被移除!
",0).show();
}
}
注册SDCardUnmountedReceiver。
:
注册一个广播接收者有两种方式。
静态注册:
在AndroidManifest.xml中注册广播
在AndroidManifest.xml文件中添加如下配置:
name="com.itheima.broadcastReciver.SDCardUnmountedReceiver"> name="android.intent.action.MEDIA_UNMOUNTED"/> scheme="file"> 动态注册: 在Java代码中注册 publicclassMainActivityextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilterintentFilter=newIntentFilter("android.intent.action.MEDIA_UNMOUNTED"); intentFilter.addDataScheme("file"); registerReceiver(newSDCardUnmountedReceiver(),intentFilter); System.out.println("广播接收器已经注册成功。 "); } } 由于Android高版本中已经不支持SDCard的卸载,因此我们使用Android2.3版本的模拟器。 在settings->Storagesettings中可以找到UnmountSDCard。 点击此选项可以移除SDCard。 软件运行效果截图如下: 发现Toast成功打印出了“SDCard已经被移除”信息。 : ★java代码注册的广播接收者优先级要比清单文件的要高,但是当前的广播接收者的生命周期的期限和activity是相关联的,activity销毁,广播接收者也就不再起作用。 ★通过清单文件注册的广播接收者在系统中运行一次后就会被注册到系统中,以后无需运行此广播接受者,但是也可以接收到广播。 ★接收广播时要注意在清单文件中添加对应的权限。 2.Android中常见广播(★★★) 2.1监听拨打电话广播 需求: 监听用户拨打电话,在用户拨打电话号码前自动加上17951等。 拦截的广播: name="android.intent.action.NEW_OUTGOING_CALL"> 需要的权限: name="android.permission.PROCESS_OUTGOING_CALLS"/> 新创建一个Android工程《IPCaller》。 在src目录下新创建一个类IPCallerReceiver继承BroadcastReceiver,重写OnReceive方法。 publicclassIPCallReveiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ //获取拨打的电话号码 StringresultData=getResultData(); //在电话号码前加上17951,然后返回数据 setResultData("17951"+resultData); } } 在AndroidManifest.xml中注册广播接收者。 在下面的配置文件中 priority="1000">属性代表着给当前接收者设置优先级,优先级越高越优先接收到广播。 name="com.itheima.ipcaller.IPCallReveiver"> priority="1000"> name="android.intent.action.NEW_OUTGOING_CALL"> 运行上面的代码,然后拨打电话5556,发现拨出去的号码已经变为179515556。 运行效果图如下: 2.2监听系统开机的广播 需求: 拦截手机开机的广播,手机开机后,弹一个提示。 拦截的广播: name="android.intent.action.BOOT_COMPLETED"> 需要的权限: name="android.permission.RECEIVE_BOOT_COMPLETED"/> 虚拟机重启命令: adbshellreboot : 3.0以上版本必须加权限,以下的版本可以不加,3.0以上的版本如果用户没有启动过程序,接收不到开启启动完成的广播。 新创建一个Android工程《开机启动》。 在src目录下新创建一个类BootReceiver继承BroadcastReceiver,重写OnReceive方法。 publicclassBootReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ Toast.makeText(context,"开机启动已经完成",1).show(); } } 在AndroidManifest.xml中注册广播接收者。 name="com.itheima.bootStart.BootReceiver"> name="android.intent.action.BOOT_COMPLETED"> 将上面的代码部署到模拟器上,然后关机重启模拟器。 运行效果图如下: 2.3监听安装和卸载程序的广播 需求: 监听程序的安装或者卸载,并在LogCat中输出提示信息。 拦截的广播: name="android.intent.action.PACKAGE_ADDED"> name="android.intent.action.PACKAGE_REMOVED"> 指定scheme: package 新创建一个Android工程《监听应用安装与卸载》 新创建InstallReceiver类继承BroadcastReceiver类,覆写onReceive方法 publicclassInstallReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ //获取包名称 StringpackageName=intent.getData().toString(); Stringaction=intent.getAction(); //如果是卸载动作 if("android.intent.action.PACKAGE_REMOVED".equals(action)){ Toast.makeText(context,packageName+"已经被删除! ",1).show(); System.out.println(packageName+"已经被删除! "); //如果是安装动作 }elseif("android.intent.action.PACKAGE_ADDED".equals(action)){ Toast.makeText(context,packageName+"已经被安装! ",1).show(); System.out.println(packageName+"已经被安装! "); } } } 在AndroidManifest.xml清单中注册InstallReceiver。 name="com.itheima.installReceiver.InstallReceiver"> name="android.intent.action.PACKAGE_REMOVED"/> name="android.intent.action.PACKAGE_ADDED"/> scheme="package"/> 将上面的工程部署在模拟器上。 然后通过系统应用管理工具,卸载一个应用程序,发现成功接收到了应用被卸载的广播。 运行图如下: 2.4拦截短信 需求: 对用户接收的短信进行拦截,若是10086发来的短信,将此短信拦截。 拦截的广播: name="android.provider.Telephony.SMS_RECEIVED"> 需要的权限: name="android.permission.RECEIVE_SMS"/> : android4.2后废除了此action。 新创建一个工程《短信拦截》,在src目录下新建SMSReceiver类继承BroadcastReceiver类 publicclassSMSReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ //获取短信数据pdus: 短信集合 Object[]objs=(Object[])intent.getExtras().get("pdus"); for(Objectpdu: objs){ //通过AndroidAPI中的SmsMessage类将短信字节数组转化为短信对象 SmsMessagemessage=SmsMessage.createFromPdu((byte[])pdu); //获取短信来源 Stringaddress=message.getOriginatingAddress(); //获取短信内容 Stringbody=message.getMessageBody(); //短信短信内容 System.out.println(address+"--"+body); Toast.makeText(context,address+"--"+body,1).show(); //终止广播 abortBroadcast(); } } } 在AndroidManifest.xml中注册短信拦截器 name="com.itheima.smsreceiver.SMSReceiver"> priority="1000"> name="android.provider.Telephony.SMS_RECEIVED"/> 在AndroidManifest.xml中添加权限 name="android.permission.RECEIVE_SMS"/> 将上面的工程部署在模拟器上 打开DDMS视图,选择EmulatorControl选项卡,在Incomeingnumber: 中填写一个号码,模拟发送消息的号码。 然后选择SMS单选按钮,在右侧的输入框输入短信的内容。 然后点击Send按钮,发送信息。 运行截图如下: 发现成功拦截了刚才发送的短信。 3.发送自定义广播(★★★★) 3.1无序广播 无序广播不可以被拦截,如果被拦截的话会报错: BroadcastReceivertryingtoreturnresultduringanon-orderedbroadcast 所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播 无序广播使用sendBroadcast方法来发送 : 无序广播的实现比较简单,因此这里只给出核心代码。 publicvoidsendBroadcast(Viewview){ //定义一个意图 Intentintent=newIntent(); //设置Action intent.setAction("com.itheima.broadcast"); //绑定数据 intent.putExtra("data","我是无序广播数据"); //发送无序广播 sendBroadcast(intent); } 3.2有序广播 有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的 广播接收者的优先级的取值范围是: 1000(最高)~-1000(最低) 相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先收到广播 无序广播使用sendOrderedBroadcast方法来发送,使用abortBroadcast方法拦截 广播接收者的优先级在清单文件中声明接收者时,在 property”属性来设置 我们新创建一个项目,来演示无序广播的发送和接收过程。 新创建一个Android工程《广播发送和接收》,包名com.itheima.broadcastAndreceiver。 在默认的MainActivity的布局中添加一个按钮,绑定事件,该事件的核心功能是发送一个有序广播,MainActivity类代码清单如下: publicclassMainActivityextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } publicvoidsendOrder(Viewview){ //意图 Intentintent=newIntent(); intent.setAction("com.itheima.data"); /** *intentTheIntenttobroadcast;allreceiversmatchingthisIntent *willreceivethebroadcast.receiverPermissionStringnaminga *permissionsthatareceivermustholdinordertoreceiveyour *broadcast.Ifnull,nopermissionisrequired.resultReceiverYour *ownBroadcastReceivertotreatasthefinalreceiverofthe *broadcast.schedulerAcustomHandlerwithwhichtoschedulethe *resultReceivercallback;ifnullitwillbescheduledinthe *Context'smainthread.initialCodeAninitialvaluefortheresult *code.OftenActivity.RESULT_OK.initialDataAninitialvalueforthe *resultdata.Oftennull.initialExtrasAninitialvalueforthe *resultextras.Oftennull. *第一个参数Intent类型: 意图 *第二个参数String类型receiverPermission,接收器需要的权限 *第三个参数BroadcastReceiver类型,自己定义的接收器作为最终接收器 *第四个参数Handler类型,用于执行接收器的回调,如果为null则在主线程中执行 *第五个参数int类型,结果代码的初始码 *第六个参数初始化参数 *第七个参数Bundle类型,额外的数据 */ sendOrderedBroadcast(intent,null,null, null,RESULT_OK,"1万元钱",null); } 分别编写MyReceiver和MyReceiver2类,继承BroadcastReceiver类 MyReceiver类代码清单: publicclassMyReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ Stringaction=intent.getAction(); StringresultData=getResultData(); Toast.makeText(context,"MyReceiver接收到"+action+"发布的广播: "+resultData,1).show(); System.out.println("MyReceiver接收到"+action+"发布的广播: "+resultData); } } MyReceiver2类代码清单: publicclassMyReceiver2extendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ Stringaction=intent.getAction(); StringresultData=getResultData(); Toast.makeText(context,"MyReceiver2接收到"+action+"发布的广播: "+resultData,1).show(); System.out.println("MyReceiver2接收到"+action+"发布的广播: "+resultData); } } 在AndroidManifest.xml中注册MyReceiver和MyReceiver2 name="com.itheima.broadcastAndreceiver.MyReceiver"> priority="1000"> name="com.itheima.data"> name="com.itheima.broadcastAndreceiver.MyReceiver2"> priority="-1000"> name="com.itheima.data"> : 在上面清单文件中我们给MyReceiver设置了最高优先级100
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 基础 07 广播