Сервисы

Введение в сервисы Android

Последнее обновление: 17.10.2021

Сервисы представляют собой особую организацию приложения. В отличие от activity они не требуют наличия визуального интерфейса. Сервисы позволяют выполнять долговременные задачи без вмешательства пользователя.

Все сервисы наследуются от класса Service и проходят следующие этапы жизненного цикла:

  • Метод onCreate(): вызывается при создании сервиса

  • Метод onStartCommand(): вызывается при получении сервисом команды, отправленной с помощью метода startService()

  • Метод onBind(): вызывается при закреплении клиента за сервисом с помощью метода bindService()

  • Метод onDestroy(): вызывается при завершении работы сервиса

Создадим простейшее приложение с сервисом. Наш сервис будет воспроизводить музыкальный файл. И вначале добавим в проект в каталог res папку raw. Для этого нажмем правой кнопкой мыши на каталог res и в контекстном меню выберем пункт New -> Android Resource Directory.

Добавление папки raw для сервисов в Android Studio и Java

Далее укажем в качестве типа папки - raw:

Добавление папки ресурсов raw для сервисов в Android Studio и Java

И поместим в эту папку (res/raw) какой-нибудь mp3-файл.

Затем добавим новый класс сервиса. Назовем его MediaService. В итоге получится следующий проект:

Добавление сервисов в Android Studio и Java

Для воспроизведения аудио-файла определим в классе MediaService следующий код:

package com.example.soundserviceapp;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MediaService extends Service {
    MediaPlayer ambientMediaPlayer;
    @Override
    public IBinder onBind(Intent intent) {

        throw new UnsupportedOperationException("Not yet implemented");
    }
    @Override
    public void onCreate(){
        ambientMediaPlayer=MediaPlayer.create(this, R.raw.music);
        ambientMediaPlayer.setLooping(true);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        ambientMediaPlayer.start();
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        ambientMediaPlayer.stop();
    }
}

Для воспроизведения музыкального файла сервис будет использовать компонент MediaPlayer.

В сервисе переопределяются все четыре метода жизненного цикла. Но по сути метод onBind() не имеет никакой реализации.

В методе onCreate() инициализируется медиа-проигрыватель с помощью музыкального ресурса, который добавлен в папку res/raw.

В методе onStartCommand() начинается воспроизведение.

Метод onStartCommand() может возвращать одно из значений, которое предполагает различное поведение в случае, если процесс сервиса был неожиданно завершен системой:

  • START_STICKY: в этом случае сервис снова возвращается в запущенное состояние, как будто если бы снова был бы вызван метод onStartCommand() без передачи в этот метод объекта Intent

  • START_REDELIVER_INTENT: в этом случае сервис снова возвращается в запущенное состояние, как будто если бы снова был бы вызван метод onStartCommand() с передачей в этот метод объекта Intent

  • START_NOT_STICKY: сервис остается в остановленном положении

Метод onDestroy() завершает воспроизведение.

Чтобы управлять сервисом, изменим activity. Сначала добавим в файл activity_main.xml пару кнопок для управления сервисом:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/start"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Старт"
        android:onClick="click"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/stop"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/stop"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Стоп"
        android:onClick="click"
        app:layout_constraintLeft_toRightOf="@id/start"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

И изменим код MainActivity:

package com.example.soundserviceapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View v) {
        Intent i=new Intent(this, MediaService.class);
        if (v.getId()==R.id.start) {
            startService(i);
        }
        else {
            stopService(i);
        }
    }
}

Для запуска сервиса используется объект Intent:

Intent i=new Intent(this, MediaService.class);

Для запуска сервиса в классе Activity определен метод startService(), в который передается объект Intent. Этот метод будет посылать команду сервису и вызывать его метод onStartCommand(), а также указывать системе, что сервис должен продолжать работать до тех пор, пока не будет вызван метод stopService().

Метод stopService() также определен к классе Activity и принимает объект Intent. Он останавливает работу сервиса, вызывая его метод onDestroy()

И в конце нам надо зарегистрировать сервис в файле манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.soundserviceapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SoundServiceApp">

        <service
            android:name=".MediaService"
            android:enabled="true"
            android:exported="true" >
        </service>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Регистрация сервиса производится в узле application с помощью добавления элемента <service>. В нем определяется атрибут android:name, который хранит название класса сервиса. И кроме того может принимать еще ряд атрибутов:

  • android:enabled: если имеет значение "true", то сервис может ли создаваться системой. Значение по умолчанию - "true".

  • android:exported: указывает, могут ли компоненты других приложений обращаться к сервису. Если имеет значение "true", то могут, если имеет значение "false", то нет.

  • android:icon: значок сервиса, представляет собой ссылку на ресурс drawable

  • android:isolatedProcess: если имеет значение true, то сервис может быть запущен как специальный процесс, изолированный от остальной системы.

  • android:label: название сервиса, которое отображается пользователю

  • android:permission: набор разрешений, которые должно применять приложение для запуска сервиса

  • android:process: название процесса, в котором запущен сервис. Как правило, имеет то же название, что и пакет приложения.

Запустим приложение и нажмем на кнопку запуска сервиса:

Сервисы startService в Android и Java

После этого начнется воспроизведение добавленной нами в приложение мелодии.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850