Android Studio 学习之Service组件及应用
文章目录
一:Service组件服务概念
- 定义:Service是Android四大组件之一,用于执行后台任务,如网络请求、音乐播放、文件下载等耗时操作,而不会阻塞用户界面。
- 特点:
- 可以执行耗时操作:但默认不会开启新线程,需要在Service中手动开启线程以避免阻塞主线程。
- 后台运行:
Service
组件可以在后台运行,即使用户切换到其他应用,它也可以继续执行任务。 - 不提供用户界面:与
Activity
不同,Service
不提供用户界面,它的主要目的是执行后台任务。 - 生命周期管理:
Service
有自己的生命周期,可以通过回调方法控制服务的启动、运行和销毁。 - 可被绑定:其他应用或组件可以绑定到
Service
上,与之进行交互,例如获取服务提供的数据或命令服务执行特定操作。 - 前台服务:
Service
可以被提升到前台运行,通常会在通知栏显示一个通知,告知用户服务正在进行。
二:service的分类
1.根据启动方式将其分为:启动服务Started Service和绑定服务Bound Service
Started Service:被启动的服务 被启动的服务是由其它组件调用 startService() 方法而启动的,该方法会导致被启动服务的生命周期方法onStartCommand() 被回调。
Bound Service:被绑定的服务 绑定服务是允许其它应用程序绑定并且与之交互的 Service 的实现类。为了提供绑定,必须实现 onBind() 回调方法。
2.根据 onStartCommand() 回调方法的返回值,将 Service 分为粘性 Service 和非粘性 Service: onStartCommand() 方法有三种返回值:
START_STICKY
(常量值:1):sticky的意思是“粘性的”。使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。当再次启动服务时,传入的第一个参数将为null;START_NOT_STICKY
(常量值:2):“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务;START_REDELIVER_INTENT
(常量值:3):重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
3.根据 Service 的使用范围还可以将其分为:本地服务 Local Service 和 远程服务 Remote Service。
- 本地服务 Local Service Local Service 用于应用程序内部。用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如 Activity 所属线程,而是单开线程后台执行,这样用户体验比较好。
- 远程服务 Remote Service Remote Service 用于 Android 系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。
三:Service的生命周期:
在包Android.app内,提供抽象类Service,定义如下:
Service
getApplication():Application
onCreate():void
onDestroy():void
onBind(Intent):|Binder
onUnbind(Intent);Boolean
[!NOTE]
(1)StartService 的生命周期为:onCreate – onStartCommand(可多次调用) – onDestroy。
(2) BindService 的生命周期为:onCreate – onBind(只一次,不可多次绑定) – onUnbind – onDestory。
(3)Service 是不能自己启动的,只有通过 Context 对象调用 startService() 和 bindService() 方法来启动。 在 Service 每一次的开启关闭过程中,只有 onStartCommand() 可被多次调用(通过多次 startService 调用),其他 onCreate()、onBind()、onUnbind()、onDestory() 在一个生命周期中只能被调用一次。
四:自定义服务与服务注册
自定义(新建)一个服务程序Service,要继承抽象类Android.app.Service,根据自启动方式,重写Service的onCreate(),onBind()和onDestory()等生命周期方法。
自定义服务需要在清单文件里使用标签注册,类似于Activity组件需要在清单文件里使用标签注册
五:使用Service完成音乐播放的开始和暂停
(1)先将音乐文件导入res文件夹内
(2)先写一个简单的music_layout界面
(3)新建一个Service服务和一个Activity,并注册。
新建文件名为MusicService的Service组件,内容如下
public class MyService extends Service {
private MediaPlayer mediaPlayer;
@Override
public void onCreate(){
super.onCreate();
//加载音乐文件
mediaPlayer=MediaPlayer.create(this,R.raw.music1);
mediaPlayer.setLooping(true);//设置循环播放
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
Log.d("MusicService","开始播放");
}
return START_STICKY;
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("MusicService","停止播放");
mediaPlayer.stop();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
新建名为MusicActivity的Activity,内容如下:
public class MusicActivity extends AppCompatActivity {
Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_layout);
button1=findViewById(R.id.music_start);
button2=findViewById(R.id.music_stop);
button1.setOnClickListener(view -> {
Intent intent=new Intent(MusicActivity.this,MyService.class);
startService(intent);
});
button2.setOnClickListener(view -> {
Intent intent=new Intent(MusicActivity.this,MyService.class);
stopService(intent);
});
}
}
(4)启动服务
就可以听见音乐啦!
写在最后:
为适应某种偏见而生活,就会给自己树起生活的栅栏。