Android中服务(service)的基本用法
服务是什么
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
定义一个服务
首先看一下如何在项目中定义一个服务。新建一个ServiceTest项目,然后右击com.example.servicetest→New→Service→Service,会弹出如图所示的窗口:
可以看到,这里我们将服务命名为MyService,Exported属性表示是否允许除了当前程序之外的其他程序访问这个服务,Enabled属性表示是否启用这个服务。将两个属性都勾中,点击Finish完成创建。
现在观察MyService中的代码,如下所示:
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
可以看到,MyService是继承自Service类的,说明这是一个服务。目前MyService中可以算是空空如也,但有一个onBind()方法特别醒目。这个方法是Service中唯一的一个抽象方法,所以必须要在子类里实现。我们会在后面的小节中使用到onBind()方法,目前可以暂时将它忽略掉。
既然是定义一个服务,自然应该在服务中去处理一些事情了,那处理事情的逻辑应该写在哪里呢?这时就可以重写Service中的另外一些方法了,如下所示:
public class MyService extends Service {
...
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy()