1、Service概括
由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.Android系统提供了Service服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用Service,典型的例子就是:MP3播放器。
Service非常适用于无需用户干预,且需要长期运行的后台功能。Service没有用户界面,有利于降低系统资源。而且Service比Activity具有更高的优先级,只有在系统资源极度匮乏的情况下,android系统才可能清理掉一部分service来保证系统的运行,而这种情况却又轻易不会出现。即使Service被系统终止了,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件。Service除了实现后台服务功能,还可以用于进程间通信,解决两个不同Activity应用程序进程之间的调用和通信问题。
2、Service生命周期
Service的生命周期如下图所示:
bindService和startService都是启动Service,有什么地方不一样呢:
-
startService Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系, 即使调用者退出了,服务依然在进行
【onCreate()->onStartCommand()->startService()->onDestroy()】,
注意其中没有onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。 -
bindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起, 调用者一旦退出服务也就终止了
【onCreate()->onBind()->onUnbind()->onDestroy()】。
3、bindService和startService使用说明
在 Android 中,startService 和 bindService 是用于与服务(Service)进行交互的两种不同方式。它们各有用途和特点,适用于不同的使用场景。以下是对这两种方法的详细说明:
3.1、 startService
用途
startService 用于启动一个服务,以执行长时间运行的操作。即使启动服务的组件(例如 Activity)被销毁,服务也会继续运行,直到调用 stopSelf() 或 stopService() 方法停止服务。
典型用法
使用 startService 通常用于执行无需与调用组件交互的后台任务,例如下载文件、播放音乐等。
示例代码
启动服务:
Intent intent = new Intent(this, MyService.class);
startService(intent);
在服务中处理启动请求:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 在这里执行后台任务
// 如果服务被杀死,使用START_STICKY或其他返回值让服务重启
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null; // 此处返回null,因为不支持绑定
}
}
停止服务:
Intent intent = new Intent(this, MyService.class);
stopService(intent);
3.2、 bindService
用途
bindService 用于绑定到一个服务,允许组件(例如 Activity)与服务进行交互。绑定的服务在所有绑定的客户端解除绑定之前不会被销毁。当最后一个绑定解除时,服务会被销毁,除非它是由 startService 启动的。
典型用法
使用 bindService 通常用于客户端和服务之间需要频繁通信的场景,例如客户端需要调用服务中的方法,或服务需要回调客户端的方法。
示例代码
定义服务接口:
public class MyService extends Service {
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
// 服务中可被客户端调用的方法
public int getRandomNumber() {
return new Random().nextInt(100);
}
}
绑定服务:
public class MainActivity extends AppCompatActivity {
private MyService myService;
private boolean isBound = false;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (MyService.LocalBinder) service;
myService = binder.getService();
isBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBound = false;
}
};
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (isBound) {
unbindService(connection);
isBound = false;
}
}
public void useService() {
if (isBound) {
int number = myService.getRandomNumber();
// 使用服务提供的数据
}
}
}
4、使用总结
4.1、生命周期:
startService:服务由 startService 启动后会一直运行,直到调用 stopSelf() 或 stopService()。它不依赖于启动它的组件的生命周期。 bindService:服务由 bindService 启动后会在所有绑定的组件解除绑定时停止。它的生命周期依赖于绑定的组件。4.2、交互方式:
startService:不提供直接与组件交互的接口,主要用于执行后台任务。
bindService:提供与组件交互的接口,组件可以调用服务中的方法进行通信。
4.3、使用场景:
startService:适用于需要在后台长时间运行的任务,例如下载文件、播放音乐等。
bindService:适用于需要与服务频繁交互的任务,例如获取实时数据、控制服务行为等。
通过理解这两种方法的区别和用途,可以根据具体需求选择合适的方式与服务进行交互。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |