Сервисы в Android с примером
Службы в 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: Методы Описание Служба Android вызывает этот метод, когда компонент (например, активность) запросы на запуск службы с помощью startService (). После запуска службы его можно остановить явным образом с помощью методов stopService () или stopSelf (). Этот метод является обязательным для реализации в службе Android и вызывается всякий раз, когда компонент приложения вызывает метод bindService (), чтобы связать себя службой. Также предусмотрен пользовательский интерфейс для общения. с сервисом эффективно, возвращая объект IBinder. Если привязка службы не требуется, метод должен возвращать значение null. Система Android вызывает этот метод, когда все клиенты отключиться от интерфейса определенной службы. Как только все клиенты будут отключены от определенного интерфейса службы и возникает необходимость подключить сервис к новым клиентам, система вызывает этот метод. Всякий раз, когда служба создается с использованием onStartCommand () или onBind (), система Android вызывает этот метод. Этот метод необходим для выполнения разовая установка. Когда служба больше не используется, система вызывает этот метод. непосредственно перед разрушением службы в качестве последнего вызова очистки. Услуги должны реализовать этот метод, чтобы очистить ресурсы, такие как зарегистрированные слушатели, потоки, приемники и т. д. onStartCommand () onBind () onUnbind () onRebind () onCreate () onDestroy ()
Пример служб Android
Воспроизведение музыки в фоновом режиме - очень распространенный пример сервисов в android . С того момента, как пользователь запускает службу, музыка непрерывно воспроизводится в фоновом режиме, даже если пользователь переключается на другое приложение. Пользователь должен явно остановить службу, чтобы приостановить воспроизведение музыки. Ниже приведена полная пошаговая реализация этой службы Android с использованием нескольких методов обратного вызова.
Note: Following steps are performed on Android Studio version 4.0
Шаг 1. Создайте новый проект
- Щелкните Файл, затем Новый => Новый проект.
- Выберите Пустое действие
- Выберите язык как Java / Kotlin
- Выберите минимальный 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" ?> 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 РЕКОМЕНДУЕМЫЕ СТАТЬИ |