注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

Android: Activity向Service发消息  

2014-07-22 09:46:12|  分类: android笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前文再续书接上回,上次的日志用了一个Service来实现对widget显示内容的定时刷新。
后来还是觉得有点不满意,因为widget的内容除了会因为服务器端提供的内容被动变化外,用户的操作也是会主动改变内容的。但目前的方案widget只会呆呆的等到下一次循环的定时任务到了才会刷新。于是寻思怎样在用户在使用应用(Activity)的时候,会因应数据的实时变化推送消息给Service更新widget。

示意流程:
Activity - event(msg) -> Service -(update remoteViews)-> Widget

----- 以上就是需求背景 -----

最初的想法..像fragment那样搞个抽象的Interface 来实现一个Listener。emmm好像在Activity初始化的时候遇到问题..小白了,没想懂怎么解决。还是循规蹈矩去搜索好别人的经验,得知方法有三:
1. 用Activity发起一个广播,Service捕获广播
2. 用AIDL
3. 用Messenger ,Service bind Activity。然后Activity 通过 bind了的Messenger 推 msg 给Service 的Handler处理。

前两个还没试,不太喜欢用广播。早前接触过msg觉得应该会比较简易吧,于是本文是低三种方式实现的

需要做的事
【Service】
1. 定义一个 Messenger 变量
2. 在onBind 以 Messenger.getBinder() 方法作为return。
3. 创建一个继承 handler 的子类,Override public void handleMessage(Message msg) 方法,msg就是捕获的来自Activy的消息。(实现业务逻辑略)

【Activity】
1. 定义一个  ServiceConnection 对象 sc
2. 定义一个 Messenger 对象 msgr
3. 在onStart() 中绑定服务,执行 bindService(new Intent(this, Service类.class), sc,Context.BIND_AUTO_CREATE);
4. 相应地在 onStop()中 unbindService(sc);
5. 在需要触发消息推送的地方 创建一个 Message 。例如
Message msg = Message.obtain(null, msgWhat, 0, 0); //obtain参数参考官方文档, handler,what,arg1,arg2
6. 用 msgr.send(msg) 的方式推送出这条消息。

*msg 如果信息只是少量或者只用于判断状态, what,arg1,arg2 已经足够,需要附带携带更丰富的信息也可以用 msg.setData(bundle); //打包数据 ,可谓好使好用。

具体实现代码我就不做搬运工了,参考下面的链接有详尽完善的源码。
  评论这张
 
阅读(4472)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018