前言

Service可以理解为没有布局的Activity,可以进行音乐播放,后台下载等操作。

注意:Service是运行于主线程中的,不能进行耗时操作。

如何创建一个Service

Service从创建到启动涉及到新进程创建和跨进程通信

Service的启动流程:

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. zygote进程fork出新的子进程Remote Service进程;
  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;
  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。

到此,Service便正式启动完成。当创建的是本地服务或者服务所属进程已创建时,则无需经过上述步骤2、3,直接创建服务即可。

Service启动方式1

利用Intent意图,调用startService方法。

被启动后会立马执行onCreate和onSatartCommand方法,Activity退出之后,不会调用onDestroy方法销毁Service。

Intent intent = new Intent(this, MyService.class);
startService(intent);

Service启动方式2

调用bindService,Activity可以与Service进行通信。如果用绑定方式来启动服务,调用bindService方法时需要传递三个参数,分别是Intent, ServiceConnection, int flags

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

第一个参数,intent意图里设置要启动的Service;

第二个参数,ServiceConnection要new出来,是一个接口实现,需要重写它的两个方法:onServiceConnected, onServiceDisconnected。

可以看到第一个回调方法onServiceConnected()中需要一个IBinder类型的对象,而Service的onBond()方法所返回的就是一个IBinder类型。

可以在Service下创建一个MyBinder类,来进行双向的通信,然后在onBind()方法里返回一个MyBinder对象。

然后在Activity中,创建ServiceConnection时,在onServiceConnected()方法里使用这个MyBinder类(可能需要类型转换),可以直接调用它的方法。

还能在MyBinder里创建一个MyService对象,构造方法里将MyService对象传进去,就可以在MyBinder里使用Service的方法,进而Activity也能使用MyService的方法了。

bindService()的调用顺序,首先是Service里的onBind()方法, 然后返回一个MyBinder对象到onServiceConnected(),再执行这个方法。利用返回的MyBinder对象,就可以调用Service里的方法了。

第三个参数,一般填BIND_AUTO_CREATE,自动创建。

注意,使用这种启动Service的方法,当activity退出之后,会执行onUnbind()方法,和onDestroy()方法。

Service的生命周期

startService方法启动的Service

在创建阶段调用onCreate(),后面在每次statrService()时调用一次onStartCommand(),销毁时由Activity直接调用stopService(),或者利用startService()的intent里传递“stop”信息,给Service进行判断,信息比对一致,Service再调用stopSelf()来停止服务。

同样的,也可以在intent里放一些其他的信息,通过startService发送给Service,再在Service的onStartCommand方法里进行判断,从而执行不同的操作。Service与Activity的通信也可以通过回调来完成。

最后阶段即,Service自己调用其onDestroy()方法。

bindService方法启动的生命周期

onCreate()方法和onBind()方法在绑定的时候调用一次。

一个Service可以有多个Activity跟其进行绑定,在所有的Activity都和它解绑的时候,这个Service才会调用onUnbind()和onDestroy()。

通过广播实现二者通信

public class MainActivity extends Activity {private ProgressBar mProgressBar;private Intent mIntent;private MsgReceiver msgReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//动态注册广播接收器msgReceiver = new MsgReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.example.communication.RECEIVER");registerReceiver(msgReceiver, intentFilter);mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);Button mButton = (Button) findViewById(R.id.button1);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//启动服务mIntent = new Intent("com.example.communication.MSG_ACTION");startService(mIntent);}});}@Overrideprotected void onDestroy() {//停止服务stopService(mIntent);//注销广播unregisterReceiver(msgReceiver);super.onDestroy();}/*** 广播接收器* @author len**/public class MsgReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//拿到进度,更新UIint progress = intent.getIntExtra("progress", 0);mProgressBar.setProgress(progress);}}}

Service代码

public class MsgService extends Service {/*** 进度条的最大值*/public static final int MAX_PROGRESS = 100;/*** 进度条的进度值*/private int progress = 0;private Intent intent = new Intent("com.example.communication.RECEIVER");/*** 模拟下载任务,每秒钟更新一次*/public void startDownLoad(){new Thread(new Runnable() {@Overridepublic void run() {while(progress < MAX_PROGRESS){progress += 5;//发送Action为com.example.communication.RECEIVER的广播intent.putExtra("progress", progress);sendBroadcast(intent);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startDownLoad();return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {return null;}}

前台Service

  • 前台服务可以说是除了绑定式Service和非绑定式Service之外,又一种Service类型。
  • 顾名思义,它是运行在前台可以和用户打交道的Service。
  • 优先级相比另外两个运行在后台的Service要高,几乎不会被系统回收。

使用场景

前台服务必须显示通知(Notification)。因此,前台服务是以通知的形式呈现的。而且该通知是不可去除的,除非服务停止或者从前台移除。

如何创建

如何结束

Android四大组件——Service相关推荐

  1. Android四大组件Service之AIDL详解

    Android四大组件Service之AIDL详解 前言 简介 基础知识 AIDL 服务端 定义AIDL文件规则 创建 .aidl 文件 清单注册 通过 IPC 传递对象 调用 IPC 方法 Andr ...

  2. Android四大组件-Service

    目录 启动方式 独立启动 使用场景 生命周期 绑定启动 使用场景 生命周期 特性 多次启动 版本适配 5.0(21) 8.0(26) 9.0(28) 12(31) 后台启动服务思路 广播启动 省电白名 ...

  3. android studio四大组件,Android 四大组件 Service 完全理解

    瞎忙到头晕... Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如 ...

  4. Android 四大组件 Service

    1. 适用范围 Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如果 ...

  5. android组件启动,Android四大组件Service之StartService启动

    对于Service两种方式在概述里已经介绍了,下面是学习是StartService的代码实例. service启动代码: package com.example.service01; import a ...

  6. android java service_[Java教程]Android四大组件之Service浅见

    [Java教程]Android四大组件之Service浅见 0 2014-04-04 18:00:28 Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行.还有一个作用是 ...

  7. 下面不是android四大组件之一的是,Android四大组件之一 Service

    Service是长期在后台运行的没界面的Android四大组件之一,默认是运行在主线程中的,如果在service中执行耗时操作超过20秒没响应的话就会造成ANR,所以可以使用IntentService ...

  8. Android 四大组件 之 Service

    子曰:温故而知新,可以为师矣. <论语>-- 孔子 一. 简介 Android 四大组件之一,特点是无需界面,用于在后台处理耗时的操作或长期任务.甚至在程序退出的情况下,我们也可以让 Se ...

  9. Android 四大组件之——Service(一)

    一.什么是服务 服务,是Android四大组件之一, 属于 计算型组件.   长期后台运行的没有界面的组件 ,特点是无用户界面.在后台运行.生命周期长 二,什么时候使用服务? 天气预报:后台的连接服务 ...

最新文章

  1. 计算机视觉中本质矩阵的概念,【计算机视觉】Lecture 19:本质矩阵和基础矩阵...
  2. GitHub开源新命令行工具:在终端里创建、管理PR成现实
  3. 算法马拉松13 A-E解题报告
  4. 2019蓝桥杯省赛---java---B---3(数列求值)
  5. python暂停和恢复游戏_pygame游戏之旅 添加游戏暂停功能
  6. linux安装网卡驱动tgz,Linux安装网卡驱动
  7. java ipmitool_ipmitool使用手册
  8. el-jy-ii计算机组成原理实验报告,EL-JY-II型计算机组成原理实验系统
  9. 比较 Python(Python 与其他语言的比较)
  10. Lingo 软件的使用 数学建模 司守奎
  11. [FPGA] 三位四选一数据选择器
  12. fcitx 添加输入法但并没有输入候选项
  13. 职场“巨婴”,毁人不倦
  14. 最后防线:三款开源HIDS应用对比评估
  15. 我的形码输入法[C语言] 之一:输入法的字词编码
  16. 仪用放大器与报警电路
  17. 宽带猫各指示灯的含义
  18. 新员工加入企业微信的2种方法:邀请和被邀请
  19. mongodb根据_id进行查询
  20. linux命令英文释义

热门文章

  1. QT中将外部字体加载到程序中
  2. C# ---XML与Excel相互转换(DataTable)
  3. 锐起无盘启动2100破解安装
  4. 【Linux】Linux安装卸载JDK
  5. 卡方分布(Chi-squared Distribution)与卡方检验(Chi-square Test)
  6. MATLAB实现遗传算法、模拟退火遗传算法求解避障路径规划问题——计算智能作业
  7. 在Salesforce Lightning Experience(闪电体验)提高性能和速度
  8. URLEncoder和URLDecoder编码和解码
  9. java ssh框架面试题_五道关于SSH框架的面试题
  10. python安装numpy、pandas