Android中的Service浅析

本文详细介绍了Android中的Service组件,包括启动和服务绑定两种启动方式的特点及生命周期。Service作为Android四大组件之一,用于执行后台任务,如播放音乐或处理网络请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道,Android应用中包括四大组件,分别是Activity、Service、BroadcastReceiver和ContentProvider,那今天就来说一说服务——Service

如果说Activity是一个应用程序的脸面的话,那么Service就可以看做是应用的内在。为什么这么比喻呢,Activity主要负责与用户进行交互的动作,例如更新UI,响应用户点击等,而Service则处理一些用户看不到的事情,比如播放一段背景音乐,发送一个非常耗时的网络请求等。下面就简单介绍一下Service的一些特性。

一、Service的两种启动方式

这两种启动方式,分别是启动和绑定方式(startService和bindService)

1.启动的服务 Started Service
通过客户端,通常是一个Activity,调用startService即可启动一个服务,我们称之为StartedService,或者是UnboundService。
Intent intent = new Intent(MainActivity.this, MusicService.class);
startService(intent);
public class MusicService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("tag", "MusicService onBind");
        return null;
    }

    @Override
    public void onCreate() {
        Log.i("tag", "MusicService onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("tag", "MusicService onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}
2.绑定的服务 Bound Service
通过客户端调用bindService即可将此客户端与一个Service绑定,不过要注意,bindService方法中需要传入一个ServiceConnection实例,来监测服务绑定成功或者失败。
    Intent intent = new Intent(MainActivity.this, LocalService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);

    // ServiceConnection实现类对象connection用于监测service的绑定情况
    ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.i("tag", "服务绑定成功");
            LocalService.MyBinder binder = (LocalService.MyBinder)iBinder;
            LocalService service = binder.getService();  //获取到LocalService实例
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.i("tag", "服务绑定失败");
        }
    };
public class LocalService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    class MyBinder extends Binder {
        LocalService getService() {
            return LocalService.this;
        }
    }
}
三、两种方式的关系
1.service通过startService启动之后,就会独立的运行,与客户端Activity无关,Activity的存在与否不影响service的运行。只有当客户端调用stopService()或者其本身调用stopSelf()时,service才会停止,然后系统将其销毁
2.通过bindService将 activity与service绑定之后,客户端(activity)可以通过一个IBinder接口与service通信。当activity结束的时候,需要手动调用unbindService解除与service的绑定。一个service可以与多个客户端绑定,当所有客户端都解除绑定后,系统将会销毁service。
3.这两种方式并不是完全独立的,一个service被startService启动之后,也可以被客户端绑定。这时如果调用stopService或者stopSelf,系统并不会销毁service,除非所有客户端都解除与此service的绑定。

二、Service的生命周期

一、独立的生命周期,看图说话

这里写图片描述

可以看出Unbound Service与BoundService的生命周期是有所不同的。
1.当调用startService或者bindService时,service都会首先执行onCreate方法,通常在这里做一些初始化的工作。当一个service将被系统销毁时,都会调用其onDestroy方法。例如音乐播放服务,可以再onCreate里面初始化播放器,在onDestroy中结束播放并释放此播放器。
2.两种方式真正活动的生命周期函数略有不同。
  • 启动的服务:从onStartCommand()接收并处理startService传递过来的intent,并在客户端调用stopService或者服务本身调用stopSelf结束
  • 绑定的服务:从onBind()接收并处理bindService传递过来的intent,并在客户端调用unbindService时结束
虽然将这两种方式的生命周期有所不同,但要记住,任何一个service都是可以通过客户端调用bindService方法与之绑定的。

还拿音乐服务来讲,客户端通过startService启动一个服务来播放音乐。当客户端想获取到播放进度,或者对播放进行控制时,可以通过bindService与之绑定然后进行通信。

二、启动并且绑定的服务生命周期
看图说话

这里写图片描述
简单一句话来说,一个既被启动又被绑定的service,只有当所有与之绑定的client全部解除绑定,并且调用stopService或者stopSelf,系统才会销毁此服务。

参考:http://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html
示例源码:https://github.com/ericzhaowei/KindService/tree/master

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值