当前位置: 首页 > article >正文

【Android 四大组件之Service】一文吃透Service 服务

作者:半身风雪
上一节:一文看懂Activity
简介:在Android组件中最基本也是最为常见的四大组件:

  • Activity
  • Service服务
  • Content Provider内容提供者
  • BroadcastReceiver广播接收器

一文看懂Service

  • 一、Service是什么
  • 二、Service 的启动方式
    • 2.1、startService 显示启动
      • 2.1.1、 Service启动
      • Service 停止
    • 2.2、bindService 绑定启动
      • 2.2.1、使用bindService()方法启动Service
      • 2.2.2、unbindService 停止服务
  • 三、Service 生命周期
      • 3.1、startService启动的生命周期
      • 3.2、bindService启动的生命周期


一、Service是什么

Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序

Service 有的启动方式有两种:

  1. startService启动
  2. bindService启动

二、Service 的启动方式

2.1、startService 显示启动

2.1.1、 Service启动

  1. 首先我们创建一个MyService 类,并且继承自Service
public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}
}

这里需要先实现onBind方法,onBind() 是Service必须实现的方法,返回的IBinder对象相当于Service组件的代理对象,Service允许其他程序组件通过IBinder对象来访问Service内部数据,这样即可实现其他程序组件与Service之间的通信。

  1. AndroidManifest.xml 清单文件中注册
<!--        组件必须要在清单文件里面注册-->
<service android:name=".MyService" />
  1. 显式启动通过类名称来启动,需要在Intent中指明Service所在的类,并调用startService (lntent)启动service。这里我使用按钮测试,需要在activity 中添加一个 serviceStart 按钮,用来演示
public void onClick(View view) {startService(new Intent(this, MyService.class));
}
  1. 回到MyService 类,并且添加一个onCreate 生命周期,用于验证我们的启动
@Override
public void onCreate() {super.onCreate();System.out.println("MyService.onCreate service 启动成功");
}
  1. 运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5m59fBu-1656317903225)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627153317992.png)]

通过该方式启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。

按上面的说法,即使访问者退出了,Service也仍然运行,那么我们该怎么结束呢?

Service 停止

  1. 我们在Activity 中,再添加一个停止按钮。

    显式启动停止Service,需要将启动Service的Intent传递给stopService (Intent)函数。

public void onClickStop(View view) {stopService(new Intent(this, MyService.class));}
  1. 回到MyService 类,并且添加一个onDestroy 生命周期,用于验证我们的停止
@Override
public void onDestroy() {super.onDestroy();System.out.println("MyService.onDestroy service 停止");
}
  1. 运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMq93Jje-1656317903226)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627154139464.png)]

上面我说startService 是显示启动,那么是不是还有对应的隐式启动呢?确实是有,但是从Android5.0开始,Google要求必须使用显示Intent启动Service,所以隐式启动咱就不介绍了。

2.2、bindService 绑定启动

2.2.1、使用bindService()方法启动Service

  1. 我们在回到Activity 中,再添加两个按钮,onClickBindServiceStart 和 onClickUnBindService 按钮
public void onClickBindServiceStart(View view) {bindService(new Intent(this, MyService.class), connection, Context.BIND_AUTO_CREATE);}

参数说明:

  • service:该参数通过Intent指定需要启动的service。
  • connection:该参数是ServiceConnnection对象,当绑定成功后,系统将调用serviceConnnection的onServiceConnected ()方法,当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法。
  • flags:该参数指定绑定时是否自动创建Service。如果指定为BIND_AUTO_CREATE,则自动创建,指定为0,则不自动创建。
  1. 初始化一个connection
private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}
};

绑定启动中,当调用者通过bindService()函数绑定Service时,onCreate()函数和onBinde ( )函数将被先后调用。

  1. 运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuxRYgIQ-1656317903227)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627160254598.png)]

通过该方式启动Service,访问者与Service绑定在一起,访问者一旦退出了,Service也就终止了。

2.2.2、unbindService 停止服务

取消绑定仅需要使用unbindService()方法,并将ServiceConnnection传递给unbindService()方法

  1. 在停止服务点击事件中使用 unbindService() 方法
public void onClickUnBindService(View view) {unbindService(connection);
}
  1. 回到MyService 类,添加onUnbind 生命周期方法
@Override
public boolean onUnbind(Intent intent) {System.out.println("MyService.onUnbind");return super.onUnbind(intent);
}

当调用者通过unbindService()函数取消绑定Service时,onUnbind()函数将被调用。如果onUnbind()函数返回true,则表示重新绑定服务时,onRebind ()函数将被调用。

  1. 运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9J6DdVXe-1656317903228)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627160654791.png)]

需要注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()只会在意外断开绑定时才被调用。

这里别忘了在onDestroy() 销毁bindService

@Override
protected void onDestroy() {super.onDestroy();unbindService(connection);
}

三、Service 生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9oEAe5a-1656317903229)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627161151540.png)]

3.1、startService启动的生命周期

onCreate() 当Service第一次被创建时,由系统调用。
onStartCommand() 当startService方法启动Service时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。

注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。

3.2、bindService启动的生命周期

onCreate() 当Service被创建时,由系统调用。
onBind() 当bindService方法启动Service时,该方法被调用。
onUnbind() 当unbindService方法解除绑定时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。

注意:一个bindService可以创建多次,销毁多次,重复使用。

http://www.lryc.cn/news/2416961.html

相关文章:

  • Linux 文件系统挂载 INITRAMFS 与 INITRD
  • PreparedStatement 用法
  • Nginx-基本安装
  • Windows Vista 系统中的用户帐户控制和UAC远程限制 设置
  • 总线概述及常见总线
  • 基于JAVAWeb+Tomcat+Mysql开发的微电影网站
  • Java 常用代码汇总-附源码
  • C语言之文件读写——fscanf(),fprintf()详解
  • mailbox机制实例介绍(一)
  • 线性代数——余子式
  • HCIP------ 网络类型 PPP协议和HDCL协议
  • TrueCrypt原理与系统开发
  • 数据增强 - Cutout、Random Erasing、Mixup、Cutmix
  • 探索 `mpvue-vant`: 微信小程序开发的新利器
  • mint-ui使用
  • JqGrid 各个属性、方法使用说明
  • 快速上手 Rook,入门云原生存储编排
  • xxxxxxxxxxxxxxxxxxxxx已转行
  • ROV简易组装说明
  • 还在为没有项目做发愁?这几个神级开源网站,都是FPGA/IC项目
  • segment fault异常及常见定位手段
  • 分享几个源码网站奉献给大家(持续更新中……)
  • 【pmcaff】重磅干货,必读的扁平化设计技巧
  • GNS3 网络模拟器介绍
  • MySQL数据类型简介以及MySQL INT、TINYINT、SMALLINT、MEDIUMINT、BIGINT(整数类型)
  • WSUS补丁服务器搭建和使用(超详细+域策略设置)
  • Web前端最新jQuery UI widget源码解析,前端入门
  • Linux之常用压缩解压缩命令
  • 最近成果
  • AXIOM的介绍与使用