Началось
Служба запускается, когда компонент приложения, такой как действие, запускает его, вызывая startService () . После запуска служба может работать в фоновом режиме неограниченное время, даже если компонент, который ее запустил, уничтожен.
граница
Служба привязывается, когда компонент приложения связывается с ней, вызывая bindService () . Связанная служба предлагает интерфейс клиент-сервер, который позволяет компонентам взаимодействовать со службой, отправлять запросы, получать результаты и даже делать это в процессах с межпроцессным взаимодействием (IPC).
Служба имеет методы обратного вызова жизненного цикла, которые вы можете реализовать, чтобы отслеживать изменения в состоянии службы, и вы можете выполнять работу на соответствующем этапе. На следующей диаграмме слева показан жизненный цикл при создании службы с помощью startService (), а на диаграмме справа показан жизненный цикл при создании службы с помощью bindService (): (любезность изображения: android.com)
Чтобы создать сервис, вы создаете 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 Studio устанавливает приложение на AVD и запускает его, и если все в порядке с настройкой и приложением, оно отобразится в следующем окне эмулятора —
Теперь, чтобы запустить ваш сервис, давайте нажмем кнопку « Запустить сервис» , это запустит сервис, и в соответствии с нашим программированием в методе onStartCommand () в нижней части симулятора появится сообщение « Сервис запущен» следующим образом:
Чтобы остановить службу, вы можете нажать кнопку «Остановить службу».