在Android开发中,Service是一个用来执行长时间运行操作而不提供用户界面的应用组件。它可以在后台执行任务,甚至在用户不与应用交互时继续运行。Service有两种启动方式:启动服务(Started Service)和绑定服务(Bound Service)。
启动服务(Started Service)
当服务被作为启动服务启动时,它是通过调用 startService(Intent)方法启动的。启动服务可以无限期运行,甚至可以在启动它的组件被销毁后继续运行。它通常用于执行不需要与用户交互的操作,如下载文件、执行上传等。一个Service被使用startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与startService的次数一致),且系统只会创建一个Service实例
生命周期:
onStartCommand():
服务一旦被启动,就会调用此方法。此方法返回一个整数,表示系统在杀死服务后如何继续运行服务(如START_STICKY,START_NOT_STICKY , START_REDELIVER_INTENT)。
START_STICKY
(粘性启动)
-
行为:服务因内存不足被系统终止后,系统会尝试重新创建服务并调用
onStartCommand()
,但不会重新传递最后一个 Intent(传入的 Intent 为null
)。 -
适用场景:
- 执行无限期运行的后台任务(如音乐播放、实时位置跟踪),无需保留原始启动参数。
- 服务可独立于启动时的 Intent 继续运行(如持续监听网络状态)
START_NOT_STICKY
(非粘性启动)
- 行为:服务被系统终止后,系统不会自动重启服务,除非有新的
startService()
请求。 - 适用场景:
- 执行一次性或短期任务(如文件下载、数据上传),任务完成后无需重启。
- 若服务终止,重新启动可能导致重复操作或数据不一致(如重复发送相同通知)。
START_REDELIVER_INTENT
(重新传递 Intent)
- 行为:服务被系统终止后,系统会重新创建服务并调用
onStartCommand()
,同时重新传递最后一个 Intent(保证 Intent 不丢失)。 - 适用场景:
- 执行依赖启动参数的任务(如根据特定参数执行网络请求、处理特定文件)。
- 需确保任务完整性的场景(如支付流程、批量数据处理
onDestroy():当服务不再使用时调用,用于清理资源。
清理的资源 :
1.使用 Handler
发送延迟消息或循环消息(如定时任务),需清除未处理的消息
2.服务中注册了系统监听器(如网络状态变化、屏幕解锁事件)
3.若服务通过 bindService()
绑定了其他 Service(如 MediaPlayerService
),需 在 onDestroy()
中解绑并断开连接
绑定服务(Bound Service)
绑定服务是另一种服务,它允许一个或多个客户端(如活动)与服务绑定,并进行交互。客户端可以发送请求、获取结果,甚至是通过跨进程通信(IPC)进行通信。服务与所有客户端解绑后自动停止。某个Activity中被调用bindService方法启动,不论bindService被调用几次,Service的onCreate方法只会执行一次
生命周期:
onBind():
客户端首次绑定到服务时调用,必须返回一个IBinder对象,用 于定义客户端可以调用的接口。
onUnbind():
所有客户端解绑时调用,可以返回true和fale,由开发者在服务代码中设置,决定了后续重新绑定时的行为
返回true表示若服务未被销毁(如仍在后台运行),且希望新客户端绑定后直接恢复之前的状态 (而非重新调用 onBind()
初始化),适用于后台也要接受消息(如地图)
若 onUnbind()
返回 false
,服务会立即销毁,重新绑定需要onBind,适用于一次性服务或者安 全需求高的需要每次绑定都进行完整的安全校验的服务
最后一个客户端断开绑定:当所有通过 bindService() 绑定到该服务的客户端都调用 unbindService()时,系统会触发服务的onUnbind()
通过 startService()
或混合启动的服务:无论 onUnbind()
返回 true
还是 false
,只要服务被 startService()
启动,就需显式调用 stopService()
或 stopSelf()
才能销毁。
onRebind():
客户端再次绑定时调用,用于更新数据如地图位置,音乐播放进度,会复用IBinder对象
onDestroy():
务不再使用时调用,用于清理资源。
创建服务端
public class LocalService extends Service {
// Binder given to clients.
private final IBinder binder = new LocalBinder();
// Random number generator.
private final Random mGenerator = new Random();
public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods.
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
/** Method for clients. */
public int getRandomNumber() {
return mGenerator.nextInt(100);
}
}
创建客户端
public class BindingActivity extends Activity {
LocalService mService;
boolean mBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
// Bind to LocalService.
Intent intent = new Intent(this, LocalService.class);
/*第三个参数是 int flags 其中 Context.BIND_AUTO_CREATE(最常用)
意味着若服务未运行,自动创建并启动服务(调用 onCreate() 和 onBind())。*/
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
unbindService(connection);
mBound = false;
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
}