简介

Service适合执行不需要和用户交互,而且长期运行的任务。即使程序被切换回后台,服务仍然可以正常运行。Service并不自动开启线程,默认运行在主线程中。

Service中需要重载的函数

onCreate()方法在服务创建的时候调用。onBind()是Service中唯一的抽象方法,必须要在子类中实现。 onStartCommand()在每次启动服务(startService)的时候调用,可用于服务一旦启动就立刻去执行某个动作。

onDestroy()在服务销毁(stopService)的时候调用,可用于收回资源

在Activity中启动和停止服务

可以通过Activity中的Intent来启动/停止Service

  1. Intent startIntent = new Intent(this, MyService.class);
  2. startService(startIntent);
  3. break;
  4.  
  5. Intent stopIntent = new Intent(this, MyService.class);
  6. stopService(stopIntent);
  7. break;

在Activity中控制Service

需要创建一个类继承自Binder,然后在里面定义一些处理任务的函数。接着在MyService中创建这个类的实例,并在onBinder中返回。在Activity中创建ServiceConnection匿名类,覆盖onServiceConnected和onServiceDisconnected函数。这两个类在bind和unbind时被调用。

Service的生命周期

在Context中调用startService方法,相应的服务会自动启动,并回调onCreate->onStartCommand 在Context中调用bindService方法,可以获得一个服务的永久链接,并回调onCreate->onBind->onServiceConnected->onUnbind->onServiceDisconnected 销毁的时候不管调用了多少次onStartCommand只会调用一次onDestroy

绑定的Service在被绑定的Activity退出的时候会自动解除绑定。

向Service中传递数据

如果是通过startService启动,在startService的参数Intent中,可以通过putExtra附加数据。在Service端,通过onStartCommand的第一个参数获取这个传过来的值。

如果是通过bindService启动,在Service中的onBind函数会返回一个Binder对象,这个对象会在onServiceConnected中被返回。在Service的Binder对象中定义接口,在Activity中就可以调用。这种通过接口调用的方法要更高效。

从Service中返回数据

1, 在Service中定义callback

2, 在onBind返回的Binder中添加getService函数,让Activity可以取得Service的实例。然后就可以调用Service的setCallBack方法来添加需要通知的函数接口。

跨应用启动Service并传递数据:

在Android5.0之前可以通过隐式intent启动服务,但是Android5.0之后不可以了, 启动Service的Intent必须是Explicit的。

在两个Application之间是不可能获取到Service的定义的,需要调用SetComponent函数:

  1. serviceIntent = new Intent();
  2. serviceIntent.setComponent(new ComponentName("com.wanxiang.www.startservicefromanotherapp", "com.wanxiang.www.startservicefromanotherapp.AppService"));
  3. serviceIntent.putExtra("data", "Hello AppService");

通过这种方法可以指定要启动的Service的Application,并且也同样可以传递数据过去。但是有个前提,被启动的这个Service所在的Activity必须在运行过程中的。

同样也可以通过绑定服务来启动远程Service

  1. bindService(new Intent(this, MyService.class), this, BIND_AUTO_CREATE);

本地Activity中的onServiceConnected也会被执行:

  1. @Override
  2. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  3. System.out.println("Bind service");
  4. System.out.println(iBinder);
  5. }

传递数据:

首先在远程Activity的aidl目录中建一个本地Activity包名的目录,把本地Activity中的AIDL文件拷贝一份过去,可以在onBind()中返回这个接口的stub,并在这个接口中添加函数

  1. @Override
  2. public IBinder onBind(Intent intent) {
  3. // TODO: Return the communication channel to the service.
  4. return new IAppServiceRemoteBinderInterface.Stub() {
  5. /**
  6. * Demonstrates some basic types that you can use as parameters
  7. * and return values in AIDL.
  8. *
  9. * @param anInt
  10. * @param aLong
  11. * @param aBoolean
  12. * @param aFloat
  13. * @param aDouble
  14. * @param aString
  15. */
  16. @Override
  17. public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
  18.  
  19. }
  20.  
  21. @Override
  22. public void setData(String data) throws RemoteException {
  23. AppService.this.data = data;
  24. }
  25. };
  26. }

在远程Activity中的onServiceConnected函数中返回这个对象,并保存在类的实例变量中:

  1. @Override
  2. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  3. System.out.println("Bind service");
  4. System.out.println(iBinder);
  5. binder = IAppServiceRemoteBinderInterface.Stub.asInterface(iBinder);
  6. }
  7.  
  8. private IAppServiceRemoteBinderInterface binder = null;

然后就可以通过这个变量来调用AIDL中添加的函数,并传递数据给Service。

  1. case R.id.btnSync:
  2. if (binder != null)
  3. try {
  4. binder.setData(etInput.getText().toString());

前台Service

后台的Service会被回收,可以通过在Service中定义Notification,并调用startForeground()来使Service始终保持前台运行。

异步并且自动停止的服务

Android提供了一个IntentService专门解决创建一个异步线程并自动停止的问题。

只需要继承自这个类,并重写onHandleIntent方法,在这个方法里处理一些具体逻辑。这个方法运行在子线程里,不会造成ANR。

Android中的Service小结的更多相关文章

  1. Android 中的 Service 全面总结(转载)

    转载地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 感谢作者 Android 中的 Service 全面总结 1.Ser ...

  2. (转载)Android中的Service:Binder,Messenger,AIDL(2)

    前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...

  3. (转载)所有分类 > 开发语言与工具 > 移动开发 > Android开发 Android中的Service:默默的奉献者 (1)

    前言 这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得.于是我就干脆花了点心 ...

  4. Android 中的 Service 全面总结

    1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...

  5. Android 中的 Service 全面总结 (转)

    原文地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类   按运行地点分类: 类别 区别  优点 ...

  6. 【转】Android中保持Service的存活

    这几天一直在准备考试,总算有个半天时间可以休息下,写写博客. 如何让Service keep alive是一个很常见的问题. 在APP开发过程中,需要Service持续提供服务的应用场景太多了,比如闹 ...

  7. Android中的service

    1.service简介:service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息 ...

  8. Android中的Service与进程间通信(IPC)详解

    Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...

  9. Android中的Service组件具体解释

    Service与Activity的差别在于:Service一直在后台执行,他没实用户界面,绝不会到前台来. 一,创建和配置Service 开发Service须要两个步骤:1.继承Service子类,2 ...

随机推荐

  1. Oracle(创建序列)

    概念: 所谓序列,在oracle中就是一个对象,这个对象用来提供一个有序的数据列,这个有序的数据列的值都不重复. 1.序列可以自动生成唯一值 2.是一个可以被共享的对象 3.典型的用来生成主键值的一个 ...

  2. Oracle(DML)

    数据操作语言: insert update delete 事务控制语言: commit rollback savepoint 1.insert语句 两种格式: 直接插入 子查询插入 1. 直接插入基本 ...

  3. Java开发中经典的小实例-(输入三个数字判断三角形类型)

    import java.util.Scanner;public class threeTest {    public static void main(String[] args) {       ...

  4. SQL知识整理三:变量、全局变量、视图、事务、异常

           变量 1.局部变量的声明(一个@) declare @n int   --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36) 2 ...

  5. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

  6. Java方法trim()小记

    我们一般用trim()方法的主要作用,是为了去除字符串的首尾空格.然而根据我个人的实践经验发现,trim()这个方法只能去除部分的空格或空白符,比如半角空格:对于全角空格的话,用trim()并不能去除 ...

  7. Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider停住了

    2015.1.24进行了服务器的搬家,搬家后,更换了新的IP,导致新的IP访问以前IP的数据库服务无法成功Initializing connection provider: org.springfra ...

  8. MongoDB 概念解析

    SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 col ...

  9. 转:OSGI 实战 Equinox

    http://download.csdn.net/detail/ifmliuzhen/3231590

  10. 磁盘文件系统Fat、Fat32、NTFS、exFAT的优缺点

    我们在Windows系统里格式化磁盘的时候,文件系统的选项里可以看到有“FAT”.“FAT32”.“NTFS”等选项,在对U盘或其他移动存储设备 格式化的时候还会出现“exFAT”选项,那么这四种磁盘 ...