Учебники

Android — Сервисы

Началось

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

граница

Служба привязывается, когда компонент приложения связывается с ней, вызывая bindService () . Связанная служба предлагает интерфейс клиент-сервер, который позволяет компонентам взаимодействовать со службой, отправлять запросы, получать результаты и даже делать это в процессах с межпроцессным взаимодействием (IPC).

Служба имеет методы обратного вызова жизненного цикла, которые вы можете реализовать, чтобы отслеживать изменения в состоянии службы, и вы можете выполнять работу на соответствующем этапе. На следующей диаграмме слева показан жизненный цикл при создании службы с помощью startService (), а на диаграмме справа показан жизненный цикл при создании службы с помощью bindService (): (любезность изображения: android.com)

Жизненный цикл сервиса Android

Чтобы создать сервис, вы создаете Java-класс, который расширяет базовый класс Service или один из его существующих подклассов. Базовый класс Service определяет различные методы обратного вызова, и наиболее важные из них приведены ниже. Вам не нужно реализовывать все методы обратного вызова. Тем не менее, важно, чтобы вы понимали каждый из них и реализовали те, которые гарантируют, что ваше приложение ведет себя так, как ожидают пользователи.

Sr.No. Обратный звонок и описание
1

onStartCommand ()

Система вызывает этот метод, когда другой компонент, такой как действие, запрашивает запуск службы, вызывая startService () . Если вы реализуете этот метод, вы обязаны остановить службу, когда ее работа будет выполнена, путем вызова методов stopSelf () или stopService () .

2

onBind ()

Система вызывает этот метод, когда другой компонент хочет связываться со службой, вызывая bindService () . Если вы реализуете этот метод, вы должны предоставить интерфейс, который клиенты используют для связи со службой, возвращая объект IBinder . Вы должны всегда реализовывать этот метод, но если вы не хотите разрешать связывание, вы должны вернуть null .

3

onUnbind ()

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

4

onRebind ()

Система вызывает этот метод, когда новые клиенты подключились к службе, после того, как ранее было сообщено, что все были отключены в его onUnbind (Intent) .

5

OnCreate ()

Система вызывает этот метод, когда служба впервые создается с помощью onStartCommand () или onBind () . Этот вызов необходим для выполнения однократной настройки.

6

OnDestroy ()

Система вызывает этот метод, когда служба больше не используется и уничтожается. Ваша служба должна реализовать это для очистки любых ресурсов, таких как потоки, зарегистрированные прослушиватели, получатели и т. Д.

onStartCommand ()

Система вызывает этот метод, когда другой компонент, такой как действие, запрашивает запуск службы, вызывая startService () . Если вы реализуете этот метод, вы обязаны остановить службу, когда ее работа будет выполнена, путем вызова методов stopSelf () или stopService () .

onBind ()

Система вызывает этот метод, когда другой компонент хочет связываться со службой, вызывая bindService () . Если вы реализуете этот метод, вы должны предоставить интерфейс, который клиенты используют для связи со службой, возвращая объект IBinder . Вы должны всегда реализовывать этот метод, но если вы не хотите разрешать связывание, вы должны вернуть null .

onUnbind ()

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

onRebind ()

Система вызывает этот метод, когда новые клиенты подключились к службе, после того, как ранее было сообщено, что все были отключены в его onUnbind (Intent) .

OnCreate ()

Система вызывает этот метод, когда служба впервые создается с помощью onStartCommand () или onBind () . Этот вызов необходим для выполнения однократной настройки.

OnDestroy ()

Система вызывает этот метод, когда служба больше не используется и уничтожается. Ваша служба должна реализовать это для очистки любых ресурсов, таких как потоки, зарегистрированные прослушиватели, получатели и т. Д.

Следующий скелетный сервис демонстрирует каждый из методов жизненного цикла —

package com.tutorialspoint;

import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;

public class HelloService extends Service {
   
   /** indicates how to behave if the service is killed */
   int mStartMode;
   
   /** interface for clients that bind */
   IBinder mBinder;     
   
   /** indicates whether onRebind should be used */
   boolean mAllowRebind;

   /** Called when the service is being created. */
   @Override
   public void onCreate() {
     
   }

   /** The service is starting, due to a call to startService() */
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      return mStartMode;
   }

   /** A client is binding to the service with bindService() */
   @Override
   public IBinder onBind(Intent intent) {
      return mBinder;
   }

   /** Called when all clients have unbound with unbindService() */
   @Override
   public boolean onUnbind(Intent intent) {
      return mAllowRebind;
   }

   /** Called when a client is binding to the service with bindService()*/
   @Override
   public void onRebind(Intent intent) {

   }

   /** Called when The service is no longer used and is being destroyed */
   @Override
   public void onDestroy() {

   }
}

пример

Этот пример проведет вас через простые шаги, чтобы показать, как создать свой собственный сервис Android. Выполните следующие шаги, чтобы изменить приложение Android, которое мы создали в главе « Hello World Example»

шаг Описание
1 Вы будете использовать Android StudioIDE для создания приложения Android и назовите его « Мое приложение» в пакете com.example.tutorialspoint7.myapplication, как описано в главе « Пример Hello World» .
2 Измените основной файл активности MainActivity.java, добавив методы startService () и stopService () .
3 Создайте новый Java-файл MyService.java в пакете com.example.My Application . Этот файл будет иметь реализацию методов, связанных со службой Android.
4 Определите свой сервис в файле AndroidManifest.xml, используя тег <service … />. Приложение может иметь одну или несколько служб без каких-либо ограничений.
5 Измените содержимое файла res / layout / activity_main.xml по умолчанию, добавив две кнопки в линейный макет.
6 Нет необходимости изменять какие-либо константы в файле res / values ​​/ strings.xml . Android студия заботится о строковых значениях
7 Запустите приложение, чтобы запустить эмулятор Android, и проверьте результат изменений, внесенных в приложение.

Ниже приводится содержимое измененного основного файла активности MainActivity.java . Этот файл может включать в себя каждый из основных методов жизненного цикла. Мы добавили методы startService () и stopService () для запуска и остановки службы.

package com.example.tutorialspoint7.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
   String msg = "Android : ";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   public void startService(View view) {
      startService(new Intent(getBaseContext(), MyService.class));
   }

   // Method to stop the service
   public void stopService(View view) {
      stopService(new Intent(getBaseContext(), MyService.class));
   }
}

Ниже приводится содержание MyService.java . Этот файл может иметь реализацию одного или нескольких методов, связанных со службой, в зависимости от требований. На данный момент мы собираемся реализовать только два метода onStartCommand () и onDestroy ()

package com.example.tutorialspoint7.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

/**
   * Created by TutorialsPoint7 on 8/23/2016.
*/

public class MyService extends Service {
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
	
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Let it continue running until it is stopped.
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      return START_STICKY;
   }

   @Override
   public void onDestroy() {
      super.onDestroy();
      Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
   }
}

Ниже будет измененный контент файла AndroidManifest.xml . Здесь мы добавили тег <service … />, чтобы включить наш сервис —

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

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      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>
		
      <service android:name=".MyService" />
   </application>

</manifest>

Ниже будет содержимое файла res / layout / activity_main.xml, включающего две кнопки:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of services"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />

   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Start Services"
      android:onClick="startService"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Stop Services"
      android:id="@+id/button"
      android:onClick="stopService"
      android:layout_below="@+id/button2"
      android:layout_alignLeft="@+id/button2"
      android:layout_alignStart="@+id/button2"
      android:layout_alignRight="@+id/button2"
      android:layout_alignEnd="@+id/button2" />

</RelativeLayout>

Давайте попробуем запустить наш модифицированный Hello World! Приложение, которое мы только что изменили. Я предполагаю, что вы создали свой AVD во время настройки среды. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». Android StudioRun Icon значок из панели инструментов. Android Studio устанавливает приложение на AVD и запускает его, и если все в порядке с настройкой и приложением, оно отобразится в следующем окне эмулятора —

Android Сервис Демо

Теперь, чтобы запустить ваш сервис, давайте нажмем кнопку « Запустить сервис» , это запустит сервис, и в соответствии с нашим программированием в методе onStartCommand () в нижней части симулятора появится сообщение « Сервис запущен» следующим образом:

Запуск службы Android

Чтобы остановить службу, вы можете нажать кнопку «Остановить службу».