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

 更新时间:2022年07月20日 15:16:36   作者:半身风雪  
Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等,下面来看看详细内容,需要的朋友可以参考下

上一节: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服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Kotlin基础学习之循环和异常

    Kotlin基础学习之循环和异常

    最近在学习kotlin,Kotlin 是一个基于 JVM 的新的编程语言,下面这篇文章主要给大家介绍了关于Kotlin基础学习之循环和异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法

    Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法

    这篇文章主要介绍了Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法,涉及Android针对文件与目录的遍历及I/O操作相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android中两个Activity之间数据传递及返回问题

    Android中两个Activity之间数据传递及返回问题

    本篇文章主要介绍了Android中两个Activity之间数据传递及返回问题,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • android自定义view实现数字进度条

    android自定义view实现数字进度条

    这篇文章主要为大家详细介绍了android自定义view实现数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android中解决WebView上下滑动监听问题

    Android中解决WebView上下滑动监听问题

    本篇文章主要介绍了Android中解决WebView滑动监听问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android 炫舞漫天飞雪效果图

    Android 炫舞漫天飞雪效果图

    这篇文章主要介绍了Android 炫舞漫天飞雪效果图的相关资料,需要的朋友可以参考下
    2016-01-01
  • 如何在android中使用html作布局文件

    如何在android中使用html作布局文件

    在企业级的android开发中,使用html页面进行布局,也有很多的优势(例如:简单,大部分开发人员及美工都熟悉,方便统一进行更新,管理)
    2013-11-11
  • Kotlin使用滚动控件RecyclerView实例教程

    Kotlin使用滚动控件RecyclerView实例教程

    RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法
    2022-12-12
  • Android 桌面快捷方式实现实例详解

    Android 桌面快捷方式实现实例详解

    这篇文章主要为大家介绍了Android 桌面快捷方式实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 一文读懂Android Kotlin的数据流

    一文读懂Android Kotlin的数据流

    这篇文章主要介绍了一文读懂Android Kotlin的数据流,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07

最新评论