Android四大组件之Service服务详细讲解

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

上一节:Activity

简介:在Android组件中最基本也是最为常见的四大组件:

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

一、Service是什么

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

Service 有的启动方式有两种:

  • startService启动
  • bindService启动

二、Service 的启动方式

2.1、startService 显示启动

Service启动

首先我们创建一个MyService 类,并且继承自Service

public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

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

AndroidManifest.xml 清单文件中注册

<!--        组件必须要在清单文件里面注册-->
<service android:name=".MyService" />

显式启动通过类名称来启动,需要在Intent中指明Service所在的类,并调用startService (lntent)启动service。这里我使用按钮测试,需要在activity 中添加一个 serviceStart 按钮,用来演示

public void onClick(View view) {
    startService(new Intent(this, MyService.class));
}

回到MyService 类,并且添加一个onCreate 生命周期,用于验证我们的启动

@Override
public void onCreate() {
    super.onCreate();
    System.out.println("MyService.onCreate service 启动成功");
}

运行结果

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

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

Service 停止

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

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

public void onClickStop(View view) {
    stopService(new Intent(this, MyService.class));
}

回到MyService 类,并且添加一个onDestroy 生命周期,用于验证我们的停止

@Override
public void onDestroy() {
    super.onDestroy();
    System.out.println("MyService.onDestroy service 停止");
}

运行结果

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

2.2、bindService 绑定启动

使用bindService()方法启动Service

我们在回到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,则不自动创建。

初始化一个connection

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
    }
};

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

运行结果

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

unbindService 停止服务

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

在停止服务点击事件中使用 unbindService() 方法

public void onClickUnBindService(View view) {
    unbindService(connection);
}

回到MyService 类,添加onUnbind 生命周期方法

@Override
public boolean onUnbind(Intent intent) {
    System.out.println("MyService.onUnbind");
    return super.onUnbind(intent);
}

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

运行结果

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

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

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

三、Service 生命周期

startService启动的生命周期

onCreate() 当Service第一次被创建时,由系统调用。

onStartCommand() 当startService方法启动Service时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

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

bindService启动的生命周期

onCreate() 当Service被创建时,由系统调用。

onBind() 当bindService方法启动Service时,该方法被调用。

onUnbind() 当unbindService方法解除绑定时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

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

到此这篇关于Android四大组件之Service服务详细讲解的文章就介绍到这了,更多相关Android Service服务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android服务Service教程

    目录 1.服务用途 2.继承Service 3.启动和停止服务 4.自动启动服务 前言: Android的服务是开发Android应用程序的重要组成部分.不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同.通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等.服务能帮助我们在Android中实现多任务. 我们已经知道,安卓的活动可以启动,停止,当系统资源太低时可以销毁,服务被设计为实现具有更长执行时间的任务.安卓的服务可以从活动

  • 说说在Android如何使用服务(Service)的方法

    Android 服务(Service)适合执行那些不需要和用户交互而且还要求长期运行的任务. 服务的运行不依赖于任何用户界面,即使 APP 被切换到后台,或者打开了另外一个 APP,服务仍然能够保持正常运行. 但是当某个 APP 进程被杀掉时,那么这个 APP 所创建的所有服务也就停止咯. 另外,服务本身并不会自动开启线程,服务代码默认是运行在主线程中的.所以如果需要执行的业务逻辑耗时长,那么为了防止主线程被阻塞,我们必须在服务内部创建子线程来执行这些业务逻辑. 1 定义服务 在 Android

  • Android 判断某个服务(service)是否运行

    判断某个服务是否正在运行的方法 实现代码: /** * * * @param mContext * @param serviceName * 是包名+服务的类名(例如:net.loonggg.testbackstage.TestService) * @return true代表正在运行,false代表服务没有正在运行 */ public boolean isServiceWork(Context mContext, String serviceName) { boolean isWork = f

  • Android8.0适配前台定位服务service的示例代码

    从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置信息,详细信息请参考官方说明.按照官方指引,如果要提高位置更新频率,需要后台应用提供一个前台服务通知告知. 所以原来的单单使用locationManager获得当前位置在后台情况下无法使用了.于是打算使用一个前台服务,当app在后台时也能获得当前位置. 查了几篇博客说前台服务需要在service的onStartCommand方法中调用startForeground(int, Noti

  • Android Service服务详细介绍及使用总结

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

  • 浅谈Android Service服务的高级技巧

    1 前台服务 因为服务的优先级较低,所以当系统内存不足时,可能会回收正在后台运行的服务.如果若要避免服务被回收,可以使用前台服务. 前台服务会一直有一个图标在系统的状态栏中显示,下拉状态栏可以看到更加详细的信息,类似于消息通知效果. public class FirstService extends Service { private static final String TAG = "FirstService"; @Override public void onCreate() {

  • android Service基础(启动服务与绑定服务)

         Service是Android中一个类,它是Android 四大组件之一,使用Service可以在后台执行耗时的操作(注意需另启子线程),其中Service并不与用户产生UI交互.其他的应用组件可以启动Service,即便用户切换了其他应用,启动的Service仍可在后台运行.一个组件可以与Service绑定并与之交互,甚至是跨进程通信.通常情况下Service可以在后台执行网络请求.播放音乐.执行文件读写操作或者与contentprovider交互等.   本文主要讲述service

  • Android实现Service在前台运行服务

    前言 在做手机音乐播放器的时候,让我非常苦恼的一件事就是手机有清理内存的软件,比如百度,360等等,一点击清理音乐就停止播放了,去后台查看发现Service已经被停止并重新启动了,这显然不是我想要的,我希望音乐能够在后台播放,并且自己能控制什么时候退出,不想让系统给我清理了,就像酷狗一直在通知栏显示那样,于是我就知道了在前台运行的服务. 实现 我们先看一下结果图: 这是运行在通知栏的界面,这样就是让服务在前台运行,再清理的时候就不会导致服务被关闭了. 好了,我们直接上代码,因为要开启服务,所以我

  • Android Service服务不被停止详解及实现

    Android Service服务一直运行: 最近有个项目需求是后台一直运行Service,但是一般都是可以手动停止的,这里就提供一个方法让Android Service服务一直运行,大家看下. 1.设置->应用->运行中->停止->杀死service 这样可以在service的onDestroy()方法中重启service public void onDestroy() { Intent service = new Intent(this, MyService.class); s

  • Android四大组件之Service服务详细讲解

    目录 一.Service是什么 二.Service 的启动方式 2.1.startService 显示启动 Service启动 Service 停止 2.2.bindService 绑定启动 使用bindService()方法启动Service unbindService 停止服务 三.Service 生命周期 startService启动的生命周期 bindService启动的生命周期 上一节:Activity 简介:在Android组件中最基本也是最为常见的四大组件: Activity Se

  • Android四大组件之Service(服务)实例详解

    本文实例讲述了Android四大组件之服务用法.分享给大家供大家参考,具体如下: 很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用. 为了处理这种后台进程,Android引入了Service的概念.Service在Android中是一种长生命周期的组件,它不实现任何用户界面. 基本概念 Ÿ   Service是一种在后台运行,没有界面的组件,由其他组件调用开始. Ÿ   创建Service,定义类继承Service,An

  • Android四大组件之Service详解

    一.Service简介 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件. Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务.Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作. 二.Serv

  • Android四大组件之Activity详细介绍

    目录 理论概述 Activity的理解 Activity的定义 Activity的作用 类比Activity与Servlet Intent的理解 Intent的分类 Intent的使用 IntentFilter的理解 相关的API 设置点击监听 Activity中添加监听 layout中添加监听 设置长按监听 Activity的开发 开发流程 Activity的使用  总结 理论概述 Activity的理解 Activity的定义 Activity,字面翻译为活动,他是Android定义的四大应

  • Android四大组件之广播BroadcastReceiver详解

    定义 BroadcastReceiver,"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等等.Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现

  • Android四大组件之Activity深入解读生命周期

    目录 一.什么是Activity 二.Activity之间的跳转 三.Activity 生命周期 3.1.Activity生命周期的基本状态 3.2.Activity 生命周期的7个方法 3.3.Activity 生命周期的三个循环 简介:在Android组件中最基本也是最为常见的四大组件: Activity Service服务 Content Provider内容提供者 BroadcastReceiver广播接收器 一.什么是Activity Activity是一个应用程序组件,提供一个屏幕,

  • Android四大组件之BroadcastReceiver详解

    BroadcastReceiver(广播接收器),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一. Android 广播分为两个角色:广播发送者.广播接收者 一. 作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景: 不同组件之间通信(包括应用内 / 不同应用之间) 与 Android 系统在特定情况下的通信(如当电话呼入时.网络可用时) 多线程通信 二.实现原理 Android中的广播使用了设计模式中的观察者模式:基于

  • Android Jetpack组件中LifeCycle作用详细介绍

    目录 Jetpack 1.那么Jetpack是什么呢 2.为何使用Jetpack 3.Jetpack与AndroidX LifeCycle 1.LifeCycle的作用 2.LifeCycle应用 1.设计组件 2.使用组件 3.总结LifeCycle的使用 Jetpack Jetpack,我觉得翻译为“飞行器”更好听,因为Google针对编程历史乱象,整理出一套组件库,帮助开发者创造更完美的应用作品.现在市面上,很多公司招聘面试要求渐渐把Jetpack看作必会技能,Google也在疯狂的安利J

  • Vue组件之间的通信方式详细讲解

    目录 前言 一.父级传数据给子级 1.传输固定的具体数据 2.动态语法 3.子组件调用父组件 二.子级传数据给父级 1.使用自定义事件 2.$refs的使用 3.同级别组价以及任意组件之间的数据传递 前言 在前面,我们已经了解了vue的组件以及vue组件之间的层级关系,这个在博主的往期博客,感兴趣的可以往前挪,地址是: 1.vue组件 2.vue组件的层级关系 本文主要编写记录的是,组件之间的通信的模式以及通信的方式,我们的组件之间只能调用自己的属性和自己的方法,不能调用其他组件的属性以及方法,

  • VUE组件传参超详细讲解

    目录 Vue.cli 中怎样使用自定义的组件 Vue 组件如何进行传值的 父组件向子组件传递数据 子组件向父组件传递数据 非父子组件之间传递数据 父传子例子 子传父例子 Vue组件data为什么必须是函数 组件的命名规范 Vue 组件里的定时器要怎么销毁 Vue.cli 中怎样使用自定义的组件 第一步:在 components 目录新建你的组件文件(CounterCom.vue),script一定要export default {} 第二步:在需要用的页面(组件)中导入: import Coun

随机推荐