一、 Service简介
Service是Android 系统中的四大组件之一,它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。

二、Service的启动
Service的启动有两种方式:context.startService() 和 context.bindService(),分别对应非绑定服务和绑定服务。
1、非绑定服务
非绑定服务的生命周期如下图:

使用服务首先得自己先创建一个类去继承Service,这里创建一个UnBindService:

public class UnBindService extends Service {// startService方式启动时不调用@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();Log.d("Tag","创建服务");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 服务启动Log.d("Tag","服务启动");// 接收activity传递的数据String str = intent.getStringExtra("data");Log.d("Tag",str);return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.d("Tag", "服务挂了");}}

创建好后系统会为我们将onBind方法写好,但是此处非绑定服务不会去调用该方法。代码中的onCreate,onStartCommand都需要我们去重写,onCreate方法是在首次创建服务时调用,只要服务还在运行,当再次启动服务时不会再执行onCreate方法。onStartCommand方法会紧接着onCreate方法执行,在该方法的参数中有个intent,可以传递从activity发送过来的数据。

然后不要忘了在清单文件中注册刚才创建的服务:

<service android:name="com.example.servicetest.UnBindService"></service>

启动非绑定服务需要在activity中利用startService方法,传入一个意图intent,指定启动哪个服务:

Intent intent= new Intent(this, UnBindService.class);
intent.putExtra("data", "activity传递的数据");
startService(intent);

当执行startService方法后,会依次执行onCreate、onStartCommand方法,查看一下log信息:

我们从activity传递的数据在服务类中也接受到了,此时服务已经处于运行状态,虽然什么事也没做。我们可以在系统设置中查看正在运行的服务,我这里以夜神模拟器为例(其他模拟器、手机大家可自行查看,大致的方法都差不多):

非绑定服务启动后,即便启动该服务的activity销毁了服务依旧运行。我们可以调用stopService方法去手动结束服务,同样要传入一个intent对象:

Intent intent= new Intent(this, UnBindService.class);
stopService(intent);

当执行stopService方法后,系统将会调用服务类中onDestroy方法将服务销毁掉。

2、绑定服务
绑定服务的生命周期跟随与之关联的activity,activity销毁时绑定的服务也会随之销毁,生命周期图如下:

与非绑定服务的区别在于没有了onStartCommand方法,多了onBind和onUnbind这两个方法,同样去创建一个类继承Service并在清单文件注册:

public class BindService extends Service {@Overridepublic void onCreate() {super.onCreate();Log.d("Tag", "创建bind服务");}// bindservice启动服务时调用该方法@Overridepublic IBinder onBind(Intent intent) {// intent可传递activity传递的数据Log.d("Tag", "绑定服务");return new MyBinder();}String result = "数据";// 自定义一个类继承Binderpublic class MyBinder extends Binder {public String getdata() {return result;}}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubLog.d("Tag", "解除绑定服务");return super.onUnbind(intent);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubLog.d("Tag", "服务挂了");super.onDestroy();}
}

我们首先去看onBind方法,同样也可以利用参数intent接收activity传递的数据。注意方法的返回值,这里返回的是一个自定义类的对象,MyBinder类继承了Binder,但是onBind方法的返回值类型IBinder,为什么不报错呢?因为Binder类实现了IBinder接口。这个返回的IBinder对象我们会在activity中接收到,那该如何拿到这个对象呢?
我们需要在activity中去创建一个匿名内部类,如下所示:

ServiceConnection conn = new ServiceConnection() {// 服务异常断开连接时调用@Overridepublic void onServiceDisconnected(ComponentName name) {}// 成功绑定服务时调用@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// service即为onBind方法返回MyBinder myBinder = (MyBinder) service;Log.d("Tag","服务发给activity的数据:" + myBinder.getdata());}};

重写其中的两个方法onServiceDisconnected和onServiceConnected,在onServiceConnected方法中的第二个参数正好就是一个IBinder类型,参数service也就是onBinder返回的数据,只需要在该方法中接收,这样一来activity和服务的关系更加紧密,activity可以通过拿到的MyBinder对象去调用服务类中MyBinder类中的方法,达到控制服务的效果。
最后就需要去启动绑定服务了,代码如下:

Intent intent= new Intent(this, BindService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);

conn参数即为上面创建的ServiceConnection对象,第三个参数为一个标志, Context.BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,下面启动服务。

我们也可以手动的解除绑定,调用unbindService方法:

Intent intent= new Intent(this, BindService.class);
unbindService(conn);

解除绑定后会执行onUnbind和onDestroy方法,服务销毁。

注意:
这里所说的服务并不是子线程,它其实也是运行在UI线程中,所以服务要处理耗时操作时要开启子线程。
如有错误之处,望各位指正。

生活不只是敲代码,如果你或你身边的人喜欢摄影或者生活的点点滴滴,可以关注下我亲爱的公众号~

Android service学习笔记相关推荐

  1. 《Android 第一行代码》十一章 Service学习笔记

    Android中Service学习笔记 Service的基本使用方法 Service的启动方式有两种,第一种是使用startService()和stopService()方法来启动和停止Service ...

  2. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  3. Android 开发学习笔记:七大知识点板块汇总

    前言 我从事 Android 开发行业也有些年头,工作期间也接触过很多 Android 开发者, 因此也非常清楚 程序员最大的限制并非年龄而是实力: 但大多数初中级Android工程师,想要提升技能, ...

  4. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  5. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  6. android service 学习(上)

    转载自:http://www.cnblogs.com/allin/archive/2010/05/15/1736458.html Service是android 系统中的一种组件,它跟Activity ...

  7. android service 学习(下)

    android service 学习(下) 通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android ...

  8. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  9. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

最新文章

  1. Extjs PROXY查询params无法传参,改用extraParams
  2. linux tunnel 与cisco 三层交换机的tunnel互联
  3. 探秘Hadoop生态12:分布式日志收集系统Flume
  4. composer install 时遇到 Composer\Downloader\TransportException ...
  5. android 网卡监听,Android实时监听网络的变化
  6. 可变大小、颜色边框、样式的UISwitch
  7. cron linux_如何在Linux中使用cron
  8. leetcode 1209 python
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的企业客户管理系统
  10. velocity 将数字转为以万为单位,保留2位小数
  11. 201571030139/201571030134 小学生四则运算软件结对编程
  12. 金融交易学——一个专业交易者…
  13. 航天金税502设置模拟环境步骤
  14. data.unity3d 文件过大解决方法
  15. 记一次kubernetes的搭建遇坑coredns状态为CrashLoopBackOff并不断重启
  16. linux虚拟内存设置为多少合适,虚拟内存怎么设置最好_虚拟内存设置多少合适
  17. webpack3:html-webpack-plugin 实现自动修改引入文件名
  18. TGA文件转YUV文件
  19. LAMP 技术简介(5)
  20. 【论文笔记】SIFA——基于GAN的双向跨模态无监督域适应框架

热门文章

  1. vue纯前端留痕,搜索框历史记录,获取焦点,失去焦点历史记录消失
  2. ubuntu访问win10共享文件
  3. JavaWeb笔记之SSH(Struts2框架)
  4. QT报错:use of undeclared identifier
  5. OLED屏显示电池电量设计
  6. 树莓派 小屏幕_树莓派小技巧关闭低电压提醒图标
  7. React form表单受控组件和非受控组件
  8. 玩扫雷还有什么技巧?科学家的玩游戏方法你绝对想不到
  9. C/C++ 数学库文件 (math.h)
  10. 聚宽量化交易策略基本框架