Service是 Android 四大组件之一。主要有两个使用场景:后台运行和跨进程访问。
Service的运行不依赖与任何用户界面,可以在后台长期运行,即使程序被切换到后台甚至打开另一个应用程序,Service 仍然可以继续保持正常运行,但是需要注意 Service 默认是运行在 UI 线程的,所以如果需要在 Service 中运行耗时操作需要开一个新线程,否则可能会引发 ANR。
此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。
一、Service的启动方式:
- 启动
通过 startService 启动
Intent intent = new Intent(this, MyService.class);
startService(intent);
可以看到Service 已经运行了。
当组件用 startService()启动服务时,服务就处于“启动”状态。一旦通过这种方式启动的服务会在后台无限期的运行,即使启动它的组件销毁也不受影响。除非是整个应用销毁了或者系统必须回收内存了。
下面我们来验证一下。我们写两个 Activity:MainActivity和 ServiceActivity。我们从 MainActivity 里面跳转到ServiceActivity,在ServiceActivity启动 Service,然后再返回 MainActivity。
在 MainActivity中点击 START SERVICE ACTIVITY 按钮进入ServiceActivity
在ServiceActivity中点击 STSRT SERVICE 启动服务可以看到
服务已经启动并在后台运行。现在我们点击返回键回到 MainActivity,再看下回到 MainActivity
我们看到Service依然在后台运行。也就验证了我们上面所说的。
startService()启动的服务通常执行单一的操作,且不会将结果返回给调用方。
-
绑定
当组件通过bindService()绑定到服务时,服务处于“绑定”状态。绑定服务提供了一个客户端-服务的接口,允许客户端和服务端进行交互、发送请求、获取结果,甚至可以通过IPC跨进程进行这些操作。仅当与组件绑定时绑定服务才运行,多个组件可以绑定到同一个服务,一旦服务与所有组件取消绑定时,系统便会销毁该服务。具体验证在后面讲到服务到生命周期时会进行代码验证。 -
启动并绑定
服务既可以启动也可以绑定,此时当服务与所有组件取消绑定时,服务并不会停止,具体如何停止服务后面会说到。
二、Service生命周期
官方说明图
1、通过 startService()启动的服务的生命周期
1)、首先我们建一个 MyService 类继承 Service
public class MyService extends Service {
private final static String TAG = MyService.class.getName();
public MyService() {
super();
Log.i(TAG, "MyService Constructor");
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "MyService onCreate");
}
@Override
public int onStartCommand(Intent intent, int