Service(Local Service)简介
一、Service的作用
主要用于在后台处理一些耗时的逻辑操作,或者去执行某些长期运行的操作。
二、Service的创建
1.主要方法
IBinder onBind(Intent intent):必须实现方法。返回一个IBinder对象,程序通过该对象与Service交互
(Service类似Activity有自己的生命周期)
void onCreate():当Service第一次被创建的时候回调
void onDestroy():当Service被关闭的时候回调
int onStartCommand(Intent intent, int flags,int startId) :每次调用startService(int)→(启动Service的方法)时候回调
返回值:
1):START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务
3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
参数flags(表示启动服务的方式):
START_FLAG_REDELIVERY:如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent。这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失.
START_FLAG_RETRY:表示服务之前被设为START_STICKY,则会被传入这个标记。
启动service的时候,onCreate方法只有第一次会调用,onStartCommand和onStart每次都被调用。onStartCommand会告诉系统如何重启服务,如判断是否异常终止后重新启动,在何种情况下异常终止.
boolean onUnbind():与绑定的所有客户端断开连接(Service可与Activity绑定 稍后讲)的时候回调
2.调用流程——跟Activity类的创建相似
①子类继承Service,重写方法
②在AndroidManifest.xml注册(因为需要用Intent启动Service,所以Service类必须注册)
③调用启动方法启动Service(详见3.启动Service)
3.启动Service
| 类别 | 区别 |
| 1.startService 启动的服务 |
主要用于启动一个服务执行后台任务,不进行通信(无绑定与无法交互)。 停止服务使用stopService。 在Activity所在进程被Kill的时候,该服务依然在运行 |
| 2.bindService 启动的服务 |
该方法启动的服务要进行通信(与绑定的Acitivty交互)。 停止服务使用unbindService。 主进程被Kill后,服务便会终止。 |
| 3.startService 同时也 bindService 启动的服务 | 停止服务应同时使用stopService与unbindService(顺序由创建顺序决定) |
| 注:每种方法的生命周期也是不同的 详见4.Servier的生命周期 为什么需要这么多种Service详见 6.两种方法的用处 | |
①方法一的启动与关闭(startService)
步骤一:
/*步骤一:子类继承Service类*/
public class LocalService1 extends Service { /** * onBind 是 Service 的虚方法,因此我们不得不实现它。 * 返回 null,表示客服端不能建立到此服务的连接。 */ @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public void onStartCommand(Intent intent,int flag, int startId) { super.onStart(intent, flag,startId); } @Override public void onDestroy() { super.onDestroy(); } }
步骤二:
<service android:name=".LocalService1">
<!--intent-filter可设可不设 跟注册Activity的方式是一样的-->
<intent-filter>
<action android:name="com.chen.service.First_Service"/>
</intent-filter>
</service>
步骤三:
// 启动一个 Service
Intent intent = new Intent();
intent.setAction("com.chen.service.First_Service");//设置Intent
startService(intent); ... // 停止一个 Service stopService(intent);
②方法二的启动与关闭(bindService)
启动方法:bindService(Intente service,ServiceConnection conn,int flags);
service:intent对象
conn:监听绑定者与Service的状况。当连接成功时回调该对象的onServiceConnected(ComponentName name,IBinder service)方法。
失败时候调用onServiceDisconnected(ComponextName name)(注:用unBindService()方法断开并不会被调用)。
注:onServiceConnected返回的IBinder对象是Service类中的onBind(Intent intent)的返回值
flags:指定绑定是是否自动创建Service(如果Service还未创建) 0(不自动创建)或 BIND_AUTO_CREATE(自动创建)
步骤一:借用方法一的步骤一经过修改
//未修改部分
@Override public IBinder onBind(Intent intent) { return null; } //修改部分
private int count = 5; public class MyBinder extends Binder{
public int getCount(){
//获取当前Service的count值;
return count;
}
} @Override
public IBinder onBind(Intent intent) { return new MyBinder; }
步骤二:在Activity中启动并绑定Service
LocalService1.MyBinder binder;//定义Binder,获取Service的Binder。因为是内部类 //定义一个ServiceConnection对象
private ServiceConntection connection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMyBinder = (LocalService1.MyBinder)service;//获取binder
Log.d("MainActivity","Service is connected");
} @Override
public void onServiceDisconnected(ComponentName name) {
Log.d("MainActivity","Service is disconnect");
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,LocalService1.class);
bindService(intent,mConnection,BIND_AUTO_CREATE);//绑定到程序 int count = mBinder.getCount();//利用Binder获取Service内部信息
} @Override
protected void onDestory(){
unbindService(conn);//解除绑定
}
4.不同方法的生命周期
①.调用startService(左图),调用bindService(右图)

注:当多次调用startService方法:系统只会调用onStartCommand()方法
当多次调用bindService方法:系统只会调用onBind()方法
隐藏方法:onRebind() 产生条件:1.由startService()方法启动 2.重写onUnbind方法 return true
②先调用startService()再调用bindService()方法,再调用unbindService()
生命周期:onCreate()->onStartCommand()->onBind()->onUnbind()[重写时reuturn true]->onRebuild()
但是发现没有调用onDestory()方法:说明bindService()只是通信绑定在Acitivty,但生命周期并不与Activity绑定。(这就可以又能交互又能不在Activity消失后Service也跟着消失)
5、在什么情况下使用 startService 或 bindService 或 同时使用startService 和 bindService
如果你只是想要启动一个后台服务长期进行某项任务那么使用 startService 便可以了。
如果你想要与正在运行的 Service 取得联系,那么有两种方法,一种是使用 broadcast ,另外是使用 bindService ,前者的缺点是如果交流较为频繁,容易造成性能上的问题,并且 BroadcastReceiver 本身执行代码的时间是很短的(也许执行到一半,后面的代码便不会执行),而后者则没有这些问题,因此我们肯定选择使用 bindService(这个时候你便同时在使用 startService 和 bindService 了,这在 Activity 中更新 Service 的某些运行状态是相当有用的)。
另外如果你的服务只是公开一个远程接口,供连接上的客服端(android 的 Service 是C/S架构)远程调用执行方法。这个时候你可以不让服务一开始就运行,而只用 bindService ,这样在第一次 bindService 的时候才会创建服务的实例运行它,这会节约很多系统资源,特别是如果你的服务是Remote Service,那么该效果会越明显(当然在 Service 创建的时候会花去一定时间,你应当注意到这点)。
6、两种办法的具体用处
| 类别 | 区别 | 应用 |
| 前台服务 | 会在通知一栏显示 ONGOING 的 Notification, | 当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。 |
| 后台服务 | 默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。 | 当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。 |
7.与Thread的区别 详见 http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
疑问:Service用startService()能不能在应用程序退出的时候执行。如果能的话Remote Service是干什么用的。
Service(Local Service)简介的更多相关文章
- (转)内置系统账户:Local system/Network service/Local Service 区别
最近会转载一些 MSSQL 基础相关的文章. 参考文献: http://www.cnblogs.com/xianspace/archive/2009/04/05/1429835.html 前言 今天在 ...
- Local System/Network Service/Local Service
// The name of the account under which the service should run// 1 NT AUTHORITY\\SYSTEM 2 NT AUTHORIT ...
- [转帖]内置系统账户:Local system/Network service/Local Service 区别
内置系统账户:Local system/Network service/Local Service 区别 学习使用 xp_cmdshell 的时候 发现必须 sqlserver 的服务运行在local ...
- 内置系统账户:Local system/Network service/Local Service 区别
参考文献: http://www.cnblogs.com/xianspace/archive/2009/04/05/1429835.html 前言 今天在安装sqlserver2008 r2的时候,在 ...
- Windows内置系统账户:Local system/Network service/Local Service 区别
LocalSystem 账户 LocalSystem是预设的拥有本机所有权限的本地账户,这个账户跟通常的用户账户没有任何关联,也没有用户名和密码之类的凭证.这个服务账户可以打开注册表的HKEY_LO ...
- SSRS2:Reporting Service 配置Service Account
1,Service Account SSRS以一个Service方式实现,有三部分组成:Web Service,Report Manager和一个后台的进程,这个Service运行的账号就是Servi ...
- Local System、Local Service與Network Service
CreateService参数介绍SC_HANDLE CreateService( SC_HANDLE hSCManager, //服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCMan ...
- Android中Local Service最本质的作用是什么?
把Service等同于thread或process是一个非常常见的误解.需要强调又强调的第一点是,Android的Service是一个Context,并不必然等于一个额外的thread.如果你有仔细看 ...
- sql server Local Service, Local System or Network Service
local system account local system 选项指定一个不需要密码的本地系统账号去连接同一台电脑的sql server.local system account会限制sql s ...
随机推荐
- 增加配置Apache2 管理 SVN 访问权限
继续之前的 文章里的配置 配置Apache2 管理 SVN 一.修改配置/etc/httpd/conf.d/ subversion.conf <Location /svn/> DAV sv ...
- B - 敌兵布阵 线段树的点
B - 敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descriptio ...
- UVA 12113 Overlapping Squares
题意: 总共有6个2*2的正方形,判断是否能够成所给的形状. 思路: 一个正方形总共有9种摆放方式,对于整个地图来说摆放方式总共有2的9次方种摆放方式.然后将地图用9*5的数组表示,正方形的位置用其8 ...
- activity的生命周期详解
刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机 为了更清楚的看清楚工作的具体过程,举例如下: ,建立两个activity,一个main,一个a ...
- Go 语言读写 Excel
Excelize 是 Golang 编写的一个用来操作 Office Excel 文档类库,基于微软的 Office OpenXML 标准.可以使用它来读取.写入 XLSX 文件.相比较其他的开源类库 ...
- AngularJS 中的 Promise 和 设计模式
解决 Javascript 异步事件的传统方式是回调函数:调用一个方法,然后给它一个函数引用,当这个方法完结的时候执行这个函数引用. <!-- lang: js --> $.get('ap ...
- PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
原文: http://www.cnblogs.com/xnxylf/p/3288718.html 由于PDM 的表中 Name 会默认=Code 所以很不方便, 所以需要将 StereoType 显示 ...
- PHP解决网站高流量高并发问题
首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...
- 命名空间 - PHP手册笔记
概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命名空间 ...
- 使用Hashtable和List结合拼json数据
在做项目的时候,有时候需要向页面返回一个特定的json类型的数据,一般情况下会有下面的方法进行拼接: public String chongzhiList() throws Exception { L ...