【Android Studio】学习之Service组件及应用

Android Studio 学习之Service组件及应用

一:Service组件服务概念

  1. 定义:Service是Android四大组件之一,用于执行后台任务,如网络请求、音乐播放、文件下载等耗时操作,而不会阻塞用户界面。
  2. 特点
    • 可以执行耗时操作:但默认不会开启新线程,需要在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() 方法有三种返回值:

  1. START_STICKY(常量值:1):sticky的意思是“粘性的”。使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。当再次启动服务时,传入的第一个参数将为null;
  2. START_NOT_STICKY(常量值:2):“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务;
  3. 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)启动服务

就可以听见音乐啦!


写在最后:

为适应某种偏见而生活,就会给自己树起生活的栅栏。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值