Service的一些使用
service服务一般主要是作为后台服务使用的,前台服务一般结合通知一起。
service一般主要用作长期后台服务的,而且和Activity结合性不那么紧密,
一般如果需要频繁的更新UI主要是用Activity里面直接开Thread,然后用handler
传到UI线程中去更新UI。
不过我在用Activity这种方式去跑大量的压力测试的时候,发现经常Activty
会崩溃掉。开始是以为6.0的原因,不过另一个小伙伴的用service跑的就没有
出现我这种情况。于是我花了一两天也更换成用service去跑,不知道结果怎么样。
先大概记录下。
作为四大组件之一,需要在manifest里面配置一下,才可以启动。
service有几个主要回调方法,
onCreate:service第一次启动时会调用的方法,后面再startService时则不会调用,
因为service已经启动了。
onStartCommand(onStart已经被google宣称为过时的方法):在OnCreate方法之后会
调用的方法,当多次startService时会多次调用该方法。带有intent参数,这个
方法可以从其它地方传递数据过来。
onBind: 这个主要是方便其它组件和service进行即时调用而需要的一个方法,IBinder
比较容易让人想起Binder也就是进程间调用IPC,这里需要返回一个IBinder类型的
对象。我们可以在类的其它地方extends一个Binder类,在这个类中不需要重写任何方
法,只需要写一个我们需要在service进行调用的一个方法就好了。
onUnbind:接触绑定时需要作的一些工作可以在这个方法里面写入。
service怎么和Activity之间进行数据的传递呢,广播。
首先在Activity里面注册广播,广播可以注册很多个,
主要是用action来区分的,如registerReceiver(receiver,new IntentFilter(CURRENT_ENCRYPT_SPEED))
,可以对一个写在Activity里面写一个内部类广播接收器,其中注册多个action,
而在service里面如下:
Intent intent = new Intent(intentMsg);
intent.putExtra(name,data);
sendBroadcast(intent);
这样就可以把数据发送到Activity里面进行更新数据了。我这里用注册了14个广播,
从以前经理说过的或者网上说的,广播用多了不好。我这里出现了一个内存泄漏的问题
,A resource was acquired at attached stack trace but never released. memory leak
stackoverflow之后说是要用MAT分析,出现的比较少,还没有去分析。
在Activity里面要service停止,可以直接执行stopService方法,不过一般
我都是在onStartCommand方法里面开一个标志位true进行死循环。
我需要从Activity里面传递一个参数到service里面让标志位变为false就可以结束掉
执行的任务。
Intent service = new Intent(WorkActivity.this, WorkService.class);
conn = new MyServiceConnection();
bindService(service, conn, Context.BIND_AUTO_CREATE);
关于conn的实现如下,
public class MyServiceConnection implements ServiceConnection
{
//当绑定服务成功的时候会调用此方法
public void onServiceConnected(ComponentName name, IBinder service)
{
AppLogger.w("service Connected");
myBinder = (WorkService.MyBinder) service;
myBinder.setPressureing(false);
stopTest.setText("测试停止");
PRESSUREING = false;
}
public void onServiceDisconnected(ComponentName name)
{
}
}
当service正在执行的时候,执行bindService方法的时候是不会再次执行
onStartCommand方法,只会执行bind里面的方法,这样就会避免再次执行任务
的问题。
首先执行onServiceConnected里面的方法,再执行bind里面绑定的方法。
这样就完成了数据的传递。
记得解绑广播和解绑服务,不然又是红红的报错。
@Override
protected void onDestroy() {
PRESSUREING = false;
unregisterReceiver(receiver);
if (conn != null) {
unbindService(conn);
}
super.onDestroy();
}
service
enabled=true|false 一般默认地设置为true,表示该service可以被
system实例化。
exported=true|false,默认设置为false,表示该service不能
被其它应用程序使用,只能本应用程序内使用。
Service的一些使用的更多相关文章
- 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇
什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...
- Azure Service Fabric 开发环境搭建
微服务体系结构是一种将服务器应用程序构建为一组小型服务的方法,每个服务都按自己的进程运行,并通过 HTTP 和 WebSocket 等协议相互通信.每个微服务都在特定的界定上下文(每服务)中实现特定的 ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- org.jboss.deployment.DeploymentException: Trying to install an already registered mbean: jboss.jca:service=LocalTxCM,name=egmasDS
17:34:37,235 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080 17:34:37,281 INFO [ ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- angularjs 1 开发简单案例(包含common.js,service.js,controller.js,page)
common.js var app = angular.module('app', ['ngFileUpload']) .factory('SV_Common', function ($http) { ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
随机推荐
- Javascript注意事项三【使用假值】
0 //NumberNaN //Number'' //Stringfalse //Booleannull //Objectundefined //Undefined这些值全部都等同于false,但是它 ...
- SQLite使用教程11 表达式
SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...
- The maximum number of cell styles was exceeded. You can define up to 4000 styles
POI操作Excel中,导出的数据不是很大时,则不会有问题,而数据很多或者比较多时, 就会报以下的错误,是由于cell styles太多create造成,故一般可以把cellstyle设置放到循环外面 ...
- 对PostgreSQL的prepared statement的深入理解
看官方文档: http://www.postgresql.org/docs/current/static/sql-prepare.html PREPARE creates a prepared sta ...
- hiberante中get和load方法的区别
1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索执行机制上对比: ...
- Zmodem transfer canceled by remote side
linux sz命令时报这个错误,看了一头雾水. 仔细看了一下发现竟然是要sz的文件名称写错了,抱着个错误和误导人呢.估计路径写错了也是这个错误.
- struts2标签具体解释
要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部增加下面的代码: <%@taglib prefix="s" uri="/struts ...
- 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布
经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...
- 未打开Ad Hoc Distributed Queries
SSAS访问ORACLE数据仓库读取数据创建CUBE的时候报如下错误: SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'Open ...
- [Effective C++ --020]宁以pass-by-reference-to-const替换pass-by-value
前言: 我们都用过C的值传递方式,那么在C++情况下,值传递是怎样工作的呢? 比如: int foo(int x); int i; foo(i); 1.程序内部先取得i的一个副本 2.将副本传递到fo ...