android service交互,Android Activity与Service的交互方式

参考: http://blog.csdn.net/gebitan505/article/details/18151203

实现更新下载进度的功能

9924acf280a49c45a4a4c3888a799b23.gif

1. 通过广播交互

Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。

优缺点分析:

通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

2. 共享文件交互

这里提到的共享文件指的是Activity和Service使用同一个文件来达到传递数据的目的。我们使用SharedPreferences来实现共享,当然也可以使用其它IO方法实现,通过这种方式实现交互时需要注意,对于文件的读写的时候,同一时间只能一方读一方写,不能两方同时写

优缺点分析:

对於这种方式实现Activity与Service的交互,可以说很方便,就像使用管道,一个往裡写,一个往外读。但这种方式也有缺陷,写入数据较为复杂以及数据量较大时,就有可能导致写入与读数据出不一致的错误。同时因为经过了一个中转站,这种操作将更耗时。

3. Messenger交互(信使交互) Handler

Messenger翻译过来指的是信使,它引用了一个Handler对象,别人能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message通信,在服务端使用Handler创建一个 Messenger,客户端只要获得这个服务端的Messenger对象就可以与服务端通信了。也就是说我们可以把Messenger当做Client端与Server端的传话筒,这样就可以沟通交流了

优缺点分析:

通过Messenger来实现Activity和Service的交互,稍微深入一点我们就可以知道,其实Messenger也是通过AIDL来实现的。对於前两种实现方式,Messenger方式总体上来讲也是比较容易理解的,这就和平时使用Handler和Thread通信一个道理。

4. Server中自定义接口交互

自定义一个接口,该接口中有一个获取当前下载进度的空方法。Server端用一个类继承自Binder并实现该接口,覆写了其中获取当前下载进度的方法。Client端通过ServiceConnection获取到该类的对象,从而能够使用该获取当前下载进度的方法,最终实现实时交互。

public interface ICountService {

public int getCurrentLoad();

}

public class DownLoadService extends Service implements ICountService{

private ServiceBinder serviceBinder = new ServiceBinder();

public class ServiceBinder extends Binder implements ICountService{

@Override

public int getCurrentLoad() {

Log.i(TAG, "ServiceBinder getCurrentLoad()... i=:"+i);

return i;

}

}

@Override

public int getCurrentLoad() {

return 0;

}

}

@Override

public IBinder onBind(Intent intent) {

Log.i(TAG, "DownLoadService.onBind()...");

return serviceBinder;

}

Client端的Timer在bindService()完成之后1秒再开始获取下载进度,获取方法是直接通过int curLoad = iCountService.getCurrentLoad();这里的getCurrentLoad()方法是DownLoadService内部类ServiceBinder中的方法。Client端将获取到的下载进度更新到介面上并更新进度条。

优缺点分析:

这种方法简单实用,扩展性强,但其也有一些缺点,比如需要延迟一些再开始获取Server端的数据,从而无法完全实现从零开始同步更新。综其所述,通过自定义接口实现Activity与Service交互的方法还是比较实用的。适用於同进程中通信,不能进行跨进程通信。

5. AIDL交互

原理: AIDL属于Android的IPC机制,常用于跨进程通信,主要实现原理基于底层Binder机制。

优缺点分析:

AIDL在Android中是进程间通信常用的方式,可能使用较為复杂,但效率高,扩展性好。同时很多系统服务就是以这种方式完成与应用程序通信的。

Android Activity、Service、BroadcastReceiver 的生命周期

Activity.Service.BroadcastReceiver这三个组建是Android开发中最常使用到的组件,在它们的生命周期的各个阶段我们需要针对性的做些事情,了解这些组件的生命周期有利于我 ...

Android——Activity and Service

参考博客:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html   http://www.cnblogs.com/feisky/ar ...

Android activity和service的生命周期对比

1Activity生命周期 七个方法 1. void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行.我们新启动一个程序的时候其主窗体的o ...

android Activity绑定Service

activity可以绑定Service,并且可以调用Service中定义的方法 Service代码:在里面多了一个IBinder;个人理解是用来与Activity绑定的主要通道: public cla ...

Android开机启动Activity或者Service方法

本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/761230 这段时间在做Android的基础开发,现在有一需求是 ...

Android Activity/Service/Broadcaster三大组件之间互相调用

我们研究两个问题,1.Service如何通过Broadcaster更改activity的一个TextView.(研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity ...

Android中Activity、Service和线程之间的通信

Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

Android 跨应用调用Activity及Service

如何调用另外一个app应用的activity或者service,本文提供一个验证可行的方法. 调用方法: Intent intent=new Intent("youActionName&qu ...

Android开机启动Activity或者Service方法(转载)

这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

随机推荐

ORACLE "ORA--22992:无法使用远程表选择的LOB定位器,database link"

解决办法:    先创建一个临时表,然后把远程的含CLOB字段的表导入到临时表中,再倒入本表. create global temporary table demo_temp as select * ...

spring4+hibernate4+maven环境搭建

本文主要介绍利用maven搭建spring4+hibernate4开发环境. 首先我们创建一个maven项目,具体步骤就不详细介绍了,看看我们pom.xml文件

java集合-集合大家族

在编写 Java 程序中,我们最常用的除了八种基本数据类型,String 对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!Java 中集合大家族的成员实在是太丰富了,有常用的 Array ...

浅谈 Linux 内核无线子系统

浅谈 Linux 内核无线子系统 本文目录 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理路径 6. 数据包又是如何被接收? 7. 总结一下 L ...

context:component-scan扫描使用的use-default-filters

如下方式可以成功扫描到@Controller注解的Bean,不会扫描@Service/@Repository的Bean.

学习Berkeley DB- 入门

1 导言 首先,我们要了解Berkeley DB的一些基本特性,在IBM的开发网站上有篇文章对其有比较清晰的介绍: 这篇文章讲到了BDB的设计思想和核心数据结构.以及数据访问算法:并有常用函数使用范例 ...

windows提权操作以及系统开机关机重启代码(用到了LookupPrivilegeValue和AdjustTokenPrivileges调整进程的Token权限)

对于UAC提权操作,一般在编译期间,如果程序有需求要提权,会在编译器里设置,vs2010比较简单,在工程属性里可以直接设置,vs2005稍微有点儿麻烦,参考这篇文章: http://www.seany ...

用Iconv应对NodeJs对称加密技术在汉字编码与NoSQL的一些坑洞

·起因 汉字编码技术在实际应用中总是会存在这样或者那样的问题,尤其是在一些热门NoSQL方面多少会遇到挑战.比方说Cassandra字符集还不直接支持GB2312,要想存储写汉字那可真是麻烦.当然这还 ...

Extjs--12种布局方式

按照Extjs的4.1的文档来看,extjs的布局方式大致有12种,下面一一介绍,有些代码就是文档中的. 1.Border 边界布局 border布局,最多可以将页面分割为"东南西北中&qu ...

vue.js2.0:如何搭建开发环境及构建项目

1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转帖]AjaxControlToolkit.TabContainer 自定义样式续

Tabs控件其实是一个容器控件TabContainer和面板控件TabPanel。TabContainer控件用于包含TabPanel。TabPanel控件用于显示。下面来看一个示例:1)在VS2005中新建一个ASP.NET AJAX-Enabled Web Project项目工程,命名为Tabs。2)在Default.aspx页面上添加一个…

NodeMailer

刚开始学习MEAN, 搞个插件发个邮件。 NodeMailer貌似出镜率很高,用用。 https://nodemailer.com/smtp/ 先申请了个个人的Outlook的邮箱,测试了一把,顺利通过。耶,好激动。 const nodeMailer require(nodemailer);let transporte…

[html] 写一个布局,它的宽度是不固定的100%,如果让它的宽度始终是高度的一半呢?

[html] 写一个布局&#xff0c;它的宽度是不固定的100%&#xff0c;如果让它的宽度始终是高度的一半呢&#xff1f; <div class"ratio" style"--ratio: 0.5;"></div>.ratio {background-color: salmon;position: relative; }.ratio::before {…

c++ using 前置声明_每日优鲜前置仓模式的配货优化方案案例介绍

大渔导读&#xff1a;2019 年零售业供应链最佳实践大奖——银奖 基于每日优鲜前置仓模式的配货优化方案案例&#xff1b;1. 背景介绍&#xff1a; 每日优鲜成立于 2014 年 11 月&#xff0c;是专注于优质生鲜的移动电商&#xff0c;已在北上广深等全国 10 个核心城市建立“城市…

lg gw880 qq2011 android beta4版,LG GW880评测:CMMB天线、细节设计

机身侧面的银色边框与黑色的正面形成了鲜明的对比。不同于大部分的手机&#xff0c;LG GW880把电源/锁机键放到了机身左侧&#xff0c;而且还多了一个返回键&#xff0c;所以机身侧面设置了比较多的按键&#xff0c;设计比较复杂。机身右侧是拍照键、音量键以及数据线接口&…

数据库的事务,隔离级别和3大范式

*数据库事务的想关操作 1.事务开始:开始是一个事物,作为回滚的标记 2,回滚 rollback :回滚到上一个事务开始的地方, 或者回滚到某个存档点,期间没被 commit ; 操作都会被撤回 3.提交commit ;将事务中所有操作提交到数据库中 4.存档点:设置存档点方便回滚 *开始事务 ........确认…

IE6/IE7/Firefox浏览器不兼容原因及解决办法

浏览器的不兼容&#xff0c;大家肯定都是深恶痛绝的&#xff0c;往往我们只是去做修补&#xff0c;却忘了更重要的事情&#xff0c;那就是追溯根源&#xff0c;避免类似的不兼容再次出现。在下不才&#xff0c;归纳几点html编码要素&#xff0c;望能指点各位&#xff1a; 1.文字…

[html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么?

[html] 如果要开发一个在超级大屏上显示的可视化页面&#xff0c;你首先要考虑什么&#xff1f; 适配 清晰度个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

excel按季度分类汇总_Excel数据分析实战(1)--电商销售记录分析

Excel是市面上最流行的办公软件之一&#xff0c;也是数据分析师入门最好的学习工具。因为其功能强大、操作简单&#xff0c;可以快速对数据进行清洗&#xff0c;建模&#xff0c;可视化&#xff0c;操作者不需要其他计算机基础也能快速上手。所以选择Excel进行数据分析入门的项…

android 跳转页面出错,Android 页面跳转(无/含有返回结果)

一.两个页面的xml文件factivityandroid:layout_width"match_parent"android:layout_height"wrap_content"android:text"直接跳转" />android:layout_width"match_parent"android:layout_height"wrap_content"android:tex…

[Silverlight]奇技银巧系列-2

Silverlight奇技银巧系列&#xff1a; 所有该系列中的文章只为介绍一些Silverlight中或隐藏在Silverlight .NET framework鲜为人知的知识和技巧。这些文章并非教程&#xff0c;也是不是什么技术指导&#xff0c;您只需对文章介绍的内容保有印象。这些知识和技巧也许会在不经意间…

[html] 如何解决微信浏览器视频点击自动全屏的问题?

[html] 如何解决微信浏览器视频点击自动全屏的问题&#xff1f; 1.1 页面内播放 X5内核视频在用户点击后默认会进入全屏播放&#xff0c;前端可以设置video的x5-playsinline属性来将视频限定于网页内部播放&#xff0c;这个默认还是使用的X5内核视频播放控件&#xff0c;层级高…

好程序员Java分享Java案例_英汉字典

在写代码的时候&#xff0c;当鼠标悬浮在某一个单词上面的时候&#xff0c;有道词典点有时会弹出一个消息气泡&#xff0c;在里面中给出关于这个单词相关的解释&#xff0c;下面给大家展示一个使用Java基础语言编写的英汉字典案例&#xff1a;   实现功能&#xff1a; …

同事更新几个表_最近计划学习的几个网站资源

在没有明确需要的时候逛知乎&#xff0c;B站什么的随便看教程&#xff0c;发现资源很多&#xff0c;五花八门&#xff0c;但是总也没系统地学习一下。一会儿看一小段&#xff0c;转眼就忘光了&#xff0c;只留下一个刚才我没有在玩耍的错觉。以上是无关紧要的忏悔。接下来主要记…

[html] H5播放的video视频,如何实现对视频截图?

[html] H5播放的video视频&#xff0c;如何实现对视频截图&#xff1f; <video controls src"./assets/demo.mp4" width"400" height"300" id"video">Sorry, your browser doesnt support embedded videos.</video><bu…

带有托管代码的InfoPath2007表单模版发布到SharePoint表单库(浏览器方式查看)

在本篇文章中,将与大家分享如何将一个带有托管代码(manage code)的InfoPath2007表单模版发布到SharePoint Server2007的表单库中&#xff0c;并使得最终用户可以通过浏览器方式访问。 1. 创建InfoPath表单模版 在这里&#xff0c;我们使用VSTO2005与InfoPath2007。生成…

cefsharp System.IO.FileNotFoundException: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。...

解决办法 安装vc 2015 Redistributable 64位系统安装x64 如果还报错先装x64版本再装x86版本 https://files.cnblogs.com/files/xuejianxiyang/vc_redist.part1.rarhttps://files.cnblogs.com/files/xuejianxiyang/vc_redist.part2.rarhttps://files.cnblogs.com/files/xuejianx…

jdbc获取结果行数_java – 如何判断从JDBC执行更改的行数

我不确定如何从SQL执行中获取受影响的行数.我喜欢这个&#xff1a;boolean isResultSet statement.execute(arbitrarySQLCommand);我可以从getUpdateCount()方法获取受影响的行数.这一切都很好.我遇到的问题是更新计数为零时.这可能意味着&#xff1a;>这是一个DML语句,但它…

[html] 前端需要注意哪些SEO?

[html] 前端需要注意哪些SEO? 合理的title&#xff0c;description&#xff0c;keyswords 搜索引擎对这三项的权重逐个减小&#xff0c;title 值强调重点即可&#xff0c;重要的关键词出现不要超过两次&#xff0c;而且要靠前。2 、不同页面的tilte要有所不同&#xff1b;desc…

html语言文本框的符号,如何将文本框中的值作为HTML字符串提交?

我正在使用react draft wysiwyg库,我希望文本框中输入的值是HTML字符串的形式。我的州:editorState: EditorState.createEmptyeditorState{this.state.editorState}toolbarClassName"toolbarClassName"wrapperClassName"wrapperClassName"editorClassName&…