一、服务是什么
服务(Service)是Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
二、服务的基本用法
了解了Android 多线程编程的技术之后,下面就让我们进入到本章的正题,开始对服务的相关内容进行学习。作为Android 四大组件之一,服务也少不了有很多非常重要的知识点,那我们自然要从最基本的用法开始学习了。
1 、定义一个服务
首先看一下如何在项目中定义一个服务。新建一个ServiceTest 项目,然后在这个项目中新增一个名为MyService 的类,并让它继承自Service,完成后的代码如下所示
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
目前MyService 中可以算是空空如也,但有一个onBind()方法特别醒目。这个方法是Service 中唯一的一个抽象方法,所以必须要在子类里实现。我们会在后面的小节中使用到onBind()方法,目前可以暂时将它忽略掉。
既然是定义一个服务,自然应该在服务中去处理一些事情了,那处理事情的逻辑应该写在哪里呢?这时就可以重写Service 中的另外一些方法了,如下所示:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.v("MainActivity", "onCreate");
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.v("MainActivity", "onStart");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v("MainActivity", "onDestroy");
}
}
可以看到,这里我们又重写了onCreate()、onStartCommand()和onDestroy()这三个方法,它们是每个服务中最常用到的三个方法了。其中onCreate()方法会在服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候调用。
通常情况下,如果我们希望服务一旦启动就立刻去执行某个动作,就可以将逻辑写在onStartCommand()方法里。而当服务销毁时,我们又应该在onDestroy()方法中去回收那些不再使用的资源。
另外需要注意,每一个服务都需要在AndroidManifest.xml 文件中进行注册才能生效,不知道你有没有发现,这是Android 四大组件共有的特点。于是我们还应该修改AndroidManifest.xml文件,代码如下所示:
<service
android:name="cn.com.qiang.service.MyService">
</service>
这样的话,就已经将一个服务完全定义好了。
2、启动和停止一个服务
我们在布局文件中加入了两个按钮,分别是用于启动服务和停止服务的。然后修改MainActivity 中的代码,如下所示:
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent startintent = new Intent(MainActivity.this,MyService.class);
startService(startintent);
}
});
Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent stopintent = new Intent(MainActivity.this,MyService.class);
stopService(stopintent);
}
});
我们如何才能证实服务已经成功启动或者停止了呢?最简单的方法就是在MyService 的几个方法中加入打印日志,可以看到我们在MyService中已经加入了。
下面我们看一下运行效果:
开启服务后,LogCat中打印
关闭服务后,LogCat 中打印: