Download模块 (八)

Download模块 (八)

KeyPressListener是一个体系,而不是一个单独的类,目的也很简单,就是一套传递keyPress信息的机制。
这么做的原因是对于fragment这些非UI对象,是没有监听keyPress的功能的,而fragment虽然不是UI对象,
但是UI对象的所有处理逻辑都在fragment中,因此fragment也需要能够感知keyPress。
虽然当前 Fragment 默认对 某些keyPress有响应<back会导致当前fragment pop>,但这部分实现逻辑其实是在fragmentActivity内的,
要实现灵活的fragment自定义keyPress还需要自己有一套keyPress的检测和通知机制。

<1>KeyPress都由MainActivity来收集<不排除某些View自己进行截获收集>,mainActivity本身实现了一个KeyPressProvider接口,
这个KeyPressProvider本身提供一个receiver接口供外部的想Listen的对象来实现自己的回调,以及两个register与unregister receiver的方法。
<2>MainActivity在实现此接口时,用一个stack来存储所有register的receiver,而activity在检测到KeyPress时,只会通知stack顶的receiver<peek得到>,这么做的原因是,keyPress不应该被多一个实体响应,应该只由当前交互的UI的逻辑来响应,因此设计为stack,最前的
UI的receiver在stack顶,而在当前的UI消失时,就会pop出stack<不是严格的pop,一个fragment被另外一个fragment所取代,虽然在fragment的detach中会unregister 自己的 receiver,但是如果直接pop,就会有问题,因为只有新的fragment attach 以后,旧的fragment才会detach,如果直接pop,就会将新fragment的receiver干掉,因此unregister直接使用stack的父类Vector的remove(receiver)方法>。

<3>上面这些通知哪个receiver,以及receiver是如何保存的,其实都被封装在一个独立的类 KeyPressReceivers中了,这么做可以实现逻辑的解耦,mainActivity只需要在keyPress的时候通知KeyPressReceivers给的某个合适的receiver<其实可以仅仅通知KeyPressReceivers keyPress, 把keyPress之间传递给KeyPressReceivers自行处理>。

<trivial>
其实Activity所实现的register与unregisterReceiver也可以完全交给KeyPressReceivers这个类,mainActivity可以只维护一个
KeyPressReceivers的引用,而不必实现KeyPressProvider接口,当时在抽离存储和选择receiver的逻辑到KeyPressReceivers时,没有彻底的抽离完全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值