Broadcast 使用
【目的】
1.掌握 Broadcast 编程基础
2.掌握动态注册 Broadcast 和静态注册 Broadcast
3.掌握Notification 编程基础
4.掌握 EventBus 编程基础
在上个实验的基础上,实现静态广播、动态广播两种改变Notification内容的方法。
具体要求:
(1) 在启动应用时,会有通知产生,随机推荐一个商品。
(2) 点击通知跳转到该商品详情界面。
(3) 点击购物车图标,会有对应通知产生,并通过Eventbus在购物车列表更新数据。
(4) 点击通知返回购物车列表。
(5) 要求:启动页面的通知由静态广播产生,点击购物车图标的通知由动态广播产生。
静态广播:
如图所示,新建一个Broadcast Receiver的Java文件,我命名为MyReceiver1.java
接着在Manifest对其进行注册,如下。对其中的intent-filter进行命名,待会要用到。
打开主页MainActivity.java,使用随机数发送静态广播,其中的random_goods()函数是我用来根据编号筛选所要发送的商品数据信息的,代码就不放了。
在刚刚新建的静态广播类MyReceiver1.java文件里中重写onReceive 方法,当接收到对应广播时进行数据处理,产生通知。(接收数据以及建立notification通知栏)
静态广播的基本步骤就先到这里,至于产生的通知栏内容我放在notification部分讲。
动态广播:
相比于静态广播的新建类文件和manifest注册,动态广播的代码只需放在同一个activity即可(一般情况下)。
我在Main0Activity.java(商品详情)页面里,先是实现 BroadcastReceiver 子类(这里命名为MyReceiver2),并且重写onReceive 方法,修改方法与静态广播类似。
接着注册广播关键代码。
点击加入购物车图标后的onclick事件里,发送动态广播。
同时也要记得在编写一个函数来注销广播。
Notification:
广播接收到数据后要产生相应样式的通知栏,并且点击通知栏能够返回某一页面,我们利用notification来实现这一功能。
拿静态广播来举例子。静态广播类MyReceiver1.java里的onReceive ()接收到对应广播时获取所要数据并产生位于手机上方(拉下来可见)的通知。
具体设置如下 ↓
以上代码便是创建一个通知栏的完整过程,主要是注意Notification、Notification.Builder、NotificationManager的创建和设置。缺一不可,具体功能看代码,不再赘述。
实验文档提出思考:大icon如何设置,bm是什么?
.setLargeIcon()里的参数为bitmap,也就是位图文件(图像效果好)。
先是获取图片id(例如R.drawable.icon),再由id获得图片的bitmap。我从网上找的转换代码是BitmapFactory.decodeResource(getResources(), id)。
不过,在AS里,getResources()一直报错,查了下,在其前面加上context即可。
将apk安装到安卓手机里查看通知栏效果,发现不同手机对通知栏对的样式设定有所不同。
以下两张图里,图1(小米手机)显示不出大icon,而图二(华为手机)显示得出来。
点击通知栏能跳转到相应的商品界面。
动态广播的notification以及点击跳转也是同样的设置方式,就不多赘述了。不过值得注意的一点事,起初我点击“加入购物车”的小图标,下拉点进去那个“马上下单”的通知栏进入购物车,发现购物车总是会被清空。后来把购物车activity在manifest里的注册改为如下,即把launchNode设置为singleInstance,问题才得以解决。
(一)直接列举一些实验中遇到的小问题吧。
1 将apk装载到手机后,第一次启动APP,点击随机商品A的通知栏进入商品A界面,关掉APP。第二次启动,点击随机商品B的通知栏,进入的还是商品A界面。多次启动运行都是这样。发现实验包提供的范本apk也存在着这样的问题。无解。后来在群里看见了别的同学的解决方案,才发现问题所在。
之前在notification里传送数据时,我一直按照老师课件上给出的代码进行编程:
应将.getActivity()第4个参数由“0”改为PendingIntent.FLAG_UPDATE_CURRENT。
2 在创建notification.builder时,build()函数一直报以下的错误。百度了下却未能解决。不过奇怪的是,工程文件还是能照常编译运行,生成的app也功能正常。
(二)感觉学得有点乱,是时候考虑买本书来好好地系统学习一番了。
(三)再接再厉。