什么是Service
- Service是Android中实现程序后台运行的解决方案,它适用于去执行一些不需要与用户进行交互但是需要长期执行的任务
- Service的运行不依赖于Activity,即使启动Service的这个Activity切换到后台,Service依旧不会停止。那么Service是依赖于什么呢,它依赖于创建Service所在的那个应用程序进程,当这个进程被杀掉后,所有依赖于这个进程的Service都会停止运行。还有要注意的一点是,Service是运行在主线程中的,如果想在Service中进行耗时操作,需要创建子线程
Service有哪些应用场景
- 上面说到了,Service一般用于执行一些不需要与用户进行交互但是需要长期执行的任务,例如下载资源,还有音乐播放器的后台播放等
Service的启动方法
- Service的这两种启动方式有什么区别呢。通过startService方式启动的Service,一旦启动了,那么这个Service就与启动Activity无关了,即使这个Activity切换到后台,Service也不会停止运行。而通过bindService启动的Service则不同,看名字我们就知道,这是绑定服务的意思,也就是说,我通过Activity启动了一个Service,那么这个Service就和我Activity绑定了,当我Activity切换到后台停止运行的时候,这个Service同样会停止运行。这就是这两种方式启动的差别
- 下面就来通过实例看看具体的操作会产生什么样的效果以及它们的生命周期
startService方式启动Service
- 创建一个类继承Service并实现
onBind
方法,这里使用的是app包下的
public class MyStartService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
onBind
方法由于我们是使用startService方式启动的,所以不需要管,使用bindService方式启动同样也用不到
- 然后我们重写
onStartCommand
方法,在onStartCommand
这个方法里写我们需要执行的操作,这里我们写一个从0到9的循环输出操作,创建一个子线程
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while (count < 10) {
Log.e(TAG, "run: -------" + count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
- 好了,Service的代码我们已经写完了,下面我们就在
AndroidManifest.xml
中注册这个Service,在<application></application>
中写入下面代码
<service android:name=".MyStartService"></service>
- 注册已经搞定了,那我们就来使用一下这个Service吧,创建一个Activity,在布局中添加两个按钮用于启动和停止Service
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ServiceActivity">
<