Android Studio:Broadcast 静态&动态广播注册

一、 实验题目 

 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也功能正常。

 

(二)感觉学得有点乱,是时候考虑买本书来好好地系统学习一番了。

(三)再接再厉。

猜你喜欢

转载自blog.csdn.net/reborncgy/article/details/78696632