Сервисы


Началось

Служба запускается, когда компонент приложения, такой как действие, запускает его, вызывая 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 () в нижней части симулятора появится сообщение « Сервис запущен» следующим образом: