Сервисы в Android с примером

Опубликовано: 5 Января, 2022

Службы в Android - это специальный компонент, который упрощает работу приложения в фоновом режиме для выполнения длительных рабочих задач. Основная цель службы - гарантировать, что приложение остается активным в фоновом режиме, чтобы пользователь мог работать с несколькими приложениями одновременно. Пользовательский интерфейс нежелателен для служб Android, поскольку он предназначен для управления длительными процессами без какого-либо вмешательства пользователя. Служба может непрерывно работать в фоновом режиме, даже если приложение закрыто или пользователь переключается на другое приложение. Кроме того, компоненты приложения могут связываться со службой для осуществления межпроцессного взаимодействия (IPC). Между службами и потоками Android существует большая разница, не следует путать их. Поток - это функция, предоставляемая операционной системой, позволяющая пользователю выполнять операции в фоновом режиме. Хотя служба - это компонент Android, который выполняет длительную операцию, о которой пользователь может не знать, поскольку у нее нет пользовательского интерфейса.

Типы Android-сервисов

1. Услуги переднего плана:

Службы, которые уведомляют пользователя о текущих операциях, называются службами переднего плана. Пользователи могут взаимодействовать с сервисом с помощью уведомлений о текущей задаче. Например, при загрузке файла пользователь может отслеживать прогресс загрузки, а также может приостанавливать и возобновлять процесс.

2. Фоновые службы:

Фоновые службы не требуют вмешательства пользователя. Эти службы не уведомляют пользователя о текущих фоновых задачах, и пользователи также не могут получить к ним доступ. Такие процессы, как синхронизация данных по расписанию или сохранение данных, подпадают под эту услугу.

3. Связанные услуги:

Этот тип службы Android позволяет компонентам приложения, таким как активность, связываться с ним. Связанные службы выполняют свою задачу, пока к ним привязан любой компонент приложения. Более чем одному компоненту разрешено связываться со службой одновременно. Для привязки компонента приложения к сервису используется метод bindService ().

Жизненный цикл служб Android

В Android у сервисов есть 2 возможных пути завершения своего жизненного цикла, а именно запущено и ограничено .

1. Запущенная служба (неограниченная служба):

Следуя этому пути, служба будет запускаться, когда компонент приложения вызывает метод startService () . После запуска служба может непрерывно работать в фоновом режиме, даже если был уничтожен компонент, ответственный за запуск службы. Доступны два варианта остановки выполнения службы:

  • Вызывая метод stopService (),
  • Служба может остановить себя, используя метод stopSelf () .

2. Ограниченное обслуживание:

Его можно рассматривать как сервер в интерфейсе клиент-сервер. Следуя этому пути, компоненты приложения Android могут отправлять запросы службе и получать результаты. Служба называется ограниченной, когда компонент приложения связывает себя со службой, вызывая метод bindService () . Чтобы остановить выполнение этой службы, все компоненты должны отвязаться от службы с помощью метода unbindService () .

To carry out a downloading task in the background, the startService() method will be called. Whereas to get information regarding the download progress and to pause or resume the process while the application is still in the background, the service must be bounded with a component which can perform these tasks.



Основы служб Android

Пользовательская служба может быть создана с помощью обычного класса, расширяющего класс Service . Кроме того, для выполнения операций службы с приложениями существуют определенные методы обратного вызова, которые необходимо переопределить . Ниже приведены некоторые из важных методов служб Android:

Методы

Описание

onStartCommand ()

Служба Android вызывает этот метод, когда компонент (например, активность)

запросы на запуск службы с помощью startService (). После запуска службы

его можно остановить явным образом с помощью методов stopService () или stopSelf ().

onBind ()

Этот метод является обязательным для реализации в службе Android и вызывается

всякий раз, когда компонент приложения вызывает метод bindService (), чтобы

связать себя службой. Также предусмотрен пользовательский интерфейс для общения.

с сервисом эффективно, возвращая объект IBinder.

Если привязка службы не требуется, метод должен возвращать значение null.

onUnbind ()

Система Android вызывает этот метод, когда все клиенты

отключиться от интерфейса определенной службы.

onRebind ()

Как только все клиенты будут отключены от определенного интерфейса службы и

возникает необходимость подключить сервис к новым клиентам, система вызывает этот метод.

onCreate ()

Всякий раз, когда служба создается с использованием onStartCommand () или onBind (),

система Android вызывает этот метод. Этот метод необходим для выполнения

разовая установка.

onDestroy ()

Когда служба больше не используется, система вызывает этот метод.

непосредственно перед разрушением службы в качестве последнего вызова очистки. Услуги должны

реализовать этот метод, чтобы очистить ресурсы, такие как зарегистрированные слушатели,

потоки, приемники и т. д.

Пример служб Android

Воспроизведение музыки в фоновом режиме - очень распространенный пример сервисов в android . С того момента, как пользователь запускает службу, музыка непрерывно воспроизводится в фоновом режиме, даже если пользователь переключается на другое приложение. Пользователь должен явно остановить службу, чтобы приостановить воспроизведение музыки. Ниже приведена полная пошаговая реализация этой службы Android с использованием нескольких методов обратного вызова.

Note: Following steps are performed on Android Studio version 4.0

Шаг 1. Создайте новый проект

  1. Щелкните Файл, затем Новый => Новый проект.
  2. Выберите Пустое действие
  3. Выберите язык как Java / Kotlin
  4. Выберите минимальный SDK в соответствии с вашими потребностями.

Шаг 2. Измените файл strings.xml

Все строки, которые используются в действии, перечислены в этом файле.

XML

< resources >
< string name = "app_name" >Services_In_Android</ string >
< string name = "heading" >Services In Android</ string >
< string name = "startButtonText" >Start the Service</ string >
< string name = "stopButtonText" >Stop the Service</ string >
</ resources >

Шаг 3. Работа с файлом activity_main.xml

Откройте файл activity_main.xml и добавьте в него 2 кнопки, которые будут запускать и останавливать службу. Ниже приведен код для разработки правильного макета занятия.

XML

<? xml version = "1.0" encoding = "utf-8" ?>
< androidx.constraintlayout.widget.ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "#168BC34A"
tools:context = ".MainActivity" >
< LinearLayout
android:id = "@+id/linearLayout"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_centerVertical = "true"
android:orientation = "vertical"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent"
app:layout_constraintVertical_bias = "1.0"
tools:ignore = "MissingConstraints" >
< TextView
android:id = "@+id/textView1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_marginBottom = "170dp"
android:fontFamily = "@font/roboto"
android:text = "@string/heading"
android:textAlignment = "center"
android:textAppearance = "@style/TextAppearance.AppCompat.Large"
android:textColor = "@android:color/holo_green_dark"
android:textSize = "36sp"
android:textStyle = "bold" />
< Button
android:id = "@+id/startButton"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_marginStart = "20dp"
android:layout_marginTop = "10dp"
android:layout_marginEnd = "20dp"
android:layout_marginBottom = "20dp"
android:background = "#4CAF50"
android:fontFamily = "@font/roboto"
android:text = "@string/startButtonText"
android:textAlignment = "center"
android:textAppearance = "@style/TextAppearance.AppCompat.Display1"
android:textColor = "#FFFFFF"
android:textStyle = "bold" />
< Button
android:id = "@+id/stopButton"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_marginStart = "20dp"
android:layout_marginTop = "10dp"
android:layout_marginEnd = "20dp"
android:layout_marginBottom = "20dp"
android:background = "#4CAF50"
android:fontFamily = "@font/roboto"
android:text = "@string/stopButtonText"
android:textAlignment = "center"
android:textAppearance = "@style/TextAppearance.AppCompat.Display1"
android:textColor = "#FFFFFF"
android:textStyle = "bold" />
< ImageView
android:id = "@+id/imageView"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_marginTop = "80dp"
app:srcCompat = "@drawable/banner" />
</ LinearLayout >
</ androidx.constraintlayout.widget.ConstraintLayout >

Шаг 4: Создание настраиваемого класса обслуживания

Пользовательский класс обслуживания будет создан в том же каталоге, где находится класс MainActivity, и этот класс расширит класс обслуживания . Методы обратного вызова используются для запуска и уничтожения служб. Для воспроизведения музыки используется объект MediaPlayer . Ниже приведен код для выполнения этой задачи.

Джава

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import androidx.annotation.Nullable;
public class NewService extends Service {
// declaring object of MediaPlayer
private MediaPlayer player;
@Override
// execution of service will start
// on calling this method
public int onStartCommand(Intent intent, int flags, int startId) {
// creating a media player which
// will play the audio of Default
// ringtone in android device
player = MediaPlayer.create( this , Settings.System.DEFAULT_RINGTONE_URI );
// providing the boolean
// value as true to play
// the audio on loop
player.setLooping( true );
// starting the process
player.start();
// returns the status
// of the program
return START_STICKY;
}
@Override
// execution of the service will
// stop on calling this method
public void onDestroy() {
super .onDestroy();
// stopping the process
player.stop();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null ;
}
}

Котлин

import android.app.Service
import android.content.Intent
import android.media.MediaPlayer
import android.os.IBinder
import android.provider.Settings
class NewService : Service() {
// declaring object of MediaPlayer
private lateinit var player:MediaPlayer
// execution of service will start
// on calling this method
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
// creating a media player which
// will play the audio of Default
// ringtone in android device
player = MediaPlayer.create( this , Settings.System.DEFAULT_RINGTONE_URI)
// providing the boolean
// value as true to play
// the audio on loop
player.setLooping( true )
// starting the process
player.start()
// returns the status
// of the program
return START_STICKY
}
// execution of the service will
// stop on calling this method
override fun onDestroy() {
super .onDestroy()
// stopping the process
player.stop()
}
override fun onBind(intent: Intent): IBinder? {
return null
}
}

Шаг 5: Работа с файлом MainActivity

Теперь объекты кнопок будут объявлены, и процесс, который будет выполняться при нажатии этих кнопок, будет определен в классе MainActivity. Ниже приведен код для реализации этого шага.

Джава

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// declaring objects of Button class
private Button start, stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
// assigning ID of startButton
// to the object start
start = (Button) findViewById( R.id.startButton );
// assigning ID of stopButton
// to the object stop
stop = (Button) findViewById( R.id.stopButton );
// declaring listeners for the
// buttons to make them respond
// correctly according to the process
start.setOnClickListener( this );
stop.setOnClickListener( this );
}
public void onClick(View view) {
// process to be performed
// if start button is clicked
if (view == start){
// starting the service
startService( new Intent( this , NewService. class ) );
}
// process to be performed
// if stop button is clicked
else if (view == stop){
// stopping the service
stopService( new Intent( this , NewService. class ) );
}
}
}

Котлин

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity(), View.OnClickListener {
// declaring objects of Button class
private var start: Button? = null
private var stop: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// assigning ID of startButton
// to the object start
start = findViewById<View>(R.id.startButton) as Button
// assigning ID of stopButton
// to the object stop
stop = findViewById<View>(R.id.stopButton) as Button
// declaring listeners for the
// buttons to make them respond
// correctly according to the process
start!!.setOnClickListener( this )
stop!!.setOnClickListener( this )
}
override fun onClick(view: View) {
// process to be performed
// if start button is clicked
if (view === start) {
// starting the service
startService(Intent( this , NewService:: class .java))
}
// process to be performed
// if stop button is clicked
else if (view === stop) {
// stopping the service
stopService(Intent( this , NewService:: class .java))
}
}
}

Шаг 6. Измените файл AndroidManifest.xml

Чтобы успешно реализовать сервисы на любом устройстве Android, необходимо упомянуть созданный сервис в файле AndroidManifest.xml. Служба не может выполнить свою задачу, если она не упомянута в этом файле. Имя службы упоминается внутри тега приложения .

XML

<? xml version = "1.0" encoding = "utf-8" ?>
< manifest xmlns:android = " http://schemas.android.com/apk/res/android "
package = "com.example.services_in_android" >
< 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/AppTheme" >
< activity android:name = ".MainActivity" >
< intent-filter >
< action android:name = "android.intent.action.MAIN" />
< category android:name = "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
< meta-data