【Android】Service Lifecycle

本文主要探讨Android Service的生命周期,包括Service的启动流程、不同启动方式下Service的生命周期变化,以及如何正确管理和结束Service。特别强调了使用startService()与bindService()的区别,并提醒在屏幕旋转等场景下对Service管理的注意事项。

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

前言

Service组件作为Android的四大组件之一,是仅次于Activity的最常用组件,所有有必要对Service做一些学习和认识。


Service Lifecycle


我们今天学习的是Service Lifecycle,对其进行详细描述之前,我们先看一个Service Lifecycle图解,从直观上对其进行认识。

Service基本框架


通过一个Service实例,看一下一个Service基本框架

public class ServiceBaseInstance extends Service {

	private final int startMode = START_STICKY;
	private LocalBinder binder = new LocalBinder();

	public class LocalBinder extends Binder {

		ServiceBaseInstance getService() {
			return ServiceBaseInstance.this;
		}
	}

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		super.onStartCommand(intent, flags, startId);

		return startMode;
	}

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

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

	@Override
	public void onDestroy() {
		super.onDestroy();
	}
}

生命周期


从上图中可以看出,启动一个服务有两个程序流程,一个是使用StartService(Intent)——context.startService() ->onCreate()- >onStart()->Service running-->context.stopService() | ->onDestroy() ;另一个是使用bindService(Intent,ServiceConnection,int)来绑定一个服务——context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ;

  • 被启动的服务的生命周期:如果一个Service被Activity调用Context.startService(Intent)方法启动的,那么Service中的onCreate()方法只会被调用一次,onStartCommand()或onStart()(Android 2.0以前的版本)会被调用多次,其中调用次数等于startServic(Intent)方法调用的次数,此后Service将一直在后台中运行,而不管Activity是否在运行,直到被调用stopService(),其自身调用stopSelf()方法。假如系统资源不足时,系统也有可能将服务结束。
  • 被绑定服务的生命周期:如果一个Service被Activity调用Context.bindService()方法绑定启动,如果这个服务没有被创建,则服务的onCreate()方法会被调用且其只会被调用一次,当建立连接的时候,会调用onBinder(),其只会被执行一次,当显示调用Context.unbindService()断开连接或者之前调用bindService()方法的实例不存在了(可能是被调用finish()方法或者系统资源不足被系统回收),系统将自动调用onDestroy()方法停止Service的运行。


特别提醒

1.如果一个服务是使用startService()方法被启动的,你不能与其进行通信,除非你使用bindService(),它将一直在后台中运行,其直自身显示调用stopSelf()方法或者调用stopService()方法停止服务,当然还包括系统资源不足时,系统主动停止其运行。

2.我们使用bindService()方法绑定一个服务后,应当在某处使用unbindService()方法来接触绑定(尽管Activity被finish()后,绑定自动解除)。

3.即使用startService()又用bindService()时,只有stopService()和unbindService()都被调用之后服务才会停止,当然也有一些特殊情况,即stopSelf()和stopService()一样,unbindService()与bindService()的Context不存在了是对应的。

4.如果你的手机允许屏幕旋转,因为屏幕旋转时Activity会被创建,所以bindService()的Context不存在了。


参考: Service全面总结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值