410013796724260
• Webmoney
R335386147728
Z369087728698
Сервисы в AndroidСервисы (службы) в Android не имеют пользовательского интерфейса, работают в фоновом режиме и представлены классом android.app.Service. Используются сервисы в тех случаях, когда не требуется вмешательства пользователя, например, для выполнения сетевых запросов к веб-серверу, обработки информации, запуска уведомлений и т.д. Сервис может продолжать работать до тех пор, пока какой-либо компонент не остановит его, либо пока он сам себя не остановит по каким-либо условиям. Таким образом, сервисы в отличие от активностей предназначены для длительного функционирования. Сервисы Service является компонентом приложения. Запускается сервис другим компонентом приложения, который может привязаться к сервису для взаимодействия с ним. Сервис может принимать одну их двух форм : запущенный сервис и привязанный сервис. Запущенный сервис Привязанный сервис Пример сервисаРассмотрим простой пример запуска и останова сервиса. Для этого нам необходимо создать приложение с интерфейсом, включающим две кнопки : кнопку старта и кнопку останова. В примере необходимо создать класс сервиса и зарегистрировать сервис в манифесте приложения src/main/AndroidManifest.xml. Объявление сервиса в манифестеЧтобы объявить сервис в файле манифеста приложения необходимо добавить элемент <service> в качестве дочернего элемента секции <application> . Например : <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.test.p10service"> <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"> <service android:name=".TimeService" /> <activity android:name=".MainActivity"> <intent-filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> В примере объявлен сервис "TimeService", который может быть стартован в приложении. Атрибут <android:name> является единственным обязательным атрибутом, определяющим наименование класса сервиса. Имеются другие атрибуты, которые можно включить в элемент <service> для определения свойств сервиса. Например, атрибут <android:description> включает описание сервиса, а <android:permission> — разрешения. Дополнительно можно обеспечить доступность службы только для Вашего приложения, включив атрибут <android:exported> с установленным для него значением "false". Это не позвоит другим приложениям запускать Вашу службу даже при использовании явного намерения. Для обеспечения безопасности приложения используйте явное намерение при запуске или привязке Service и не объявляйте фильтров намерений для службы. Дополнительные сведения об объявлении сервиса в манифесте представлены в документации по описанию элемента <service>. Листинг сервисаРассмотрим пример сервиса TimeService, включенный в манифест приложения (см. выше). Класс TimeService наследует свойства сервиса Service и включает методы onCreate и onDestroy, которые срабатывают при создании и уничтожении сервиса. Метод onStartCommand вызывается системой при старте сервиса из активности методом startService. В этом методе обратимся к serviceTask и запустим отдельный поток Thread, который периодически будет выводить сообщения в консоль и Logcat. Метод onStartCommand получает от системы определенные параметры, которые не используются в этом примере. Метод onBind реализовывать не будем и вернем null. package com.android.test.p10service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import java.util.concurrent.TimeUnit; public class TimeService extends Service { private String TAG_LOG = "SERVICE"; private boolean STOP = false; public void onCreate() { super.onCreate(); Log.d(TAG_LOG, "TimeService.onCreate"); } public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG_LOG, "TimeService.onStartCommand"); serviceTask(); return super.onStartCommand(intent, flags, startId); } public void onDestroy() { super.onDestroy(); STOP = true; Log.d(TAG_LOG, "TimeService.onDestroy"); } public IBinder onBind(Intent intent) { Log.d(TAG_LOG, "TimeService.onBind"); return null; } void serviceTask() { new Thread(new Runnable() { public void run() { int i = 1; do { Log.d(TAG_LOG, "i = " + i++); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG_LOG, "STOP = " + STOP + ", " + (!STOP || (i >= 25))); } while (!STOP || (i >= 25)); stopSelf(); } }).start(); } } Описание интерфейсаПри описании интерфейса используем шаблон типа LinearLayout с двумя кнопками. Заголовки кнопок внесем в файл res/values/strings.xml. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickStart" android:text="@string/start"> </Button> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickStop" android:text="@string/stop"> </Button> </LinearLayout> Код активностиВ активности MainActivity переопределим методы onStart, onResume, onPause, onStop, onDestroy, в которых в консоль будут выводится сообщения с тегом "SERVICE". К кнопкам интерфейса подключим методы старта и останова сервиса. import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { final String TAG = "SERVICE"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.btnStart); btn.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { startService(new Intent(MainActivity.this, TimeService.class)); } }); btn = (Button) findViewById(R.id.btnStop); btn.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { stopService(new Intent(MainActivity.this, TimeService.class)); } }); Log.d(TAG, "MainActivity.onCreate"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "MainActivity.onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "MainActivity.onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "MainActivity.onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "MainActivity.onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "MainActivity.onDestroy"); } } Старт примераНиже представлен результат вывода сообщений примера в консоль. Как видно из результатов вывода сообщений на 5-ой секунде приложение было остановлено, а сервис продолжил свою работу. На 10-ой секунде приложение возобновило свою работу, и через 3 секунды сервис был остановлен. D/SERVICE: MainActivity.onCreate D/SERVICE: MainActivity.onStart D/SERVICE: MainActivity.onResume D/SERVICE: TimeService.onCreate D/SERVICE: TimeService.onStartCommand D/SERVICE: i = 1 D/SERVICE: i = 2 D/SERVICE: i = 3 D/SERVICE: i = 4 D/SERVICE: MainActivity.onPause D/SERVICE: MainActivity.onStop D/SERVICE: i = 5 D/SERVICE: i = 6 D/SERVICE: i = 7 D/SERVICE: i = 8 D/SERVICE: i = 9 D/SERVICE: MainActivity.onStart D/SERVICE: MainActivity.onResume D/SERVICE: i = 10 D/SERVICE: i = 11 D/SERVICE: i = 12 D/SERVICE: TimeService.onDestroy Связанные страницы
Layout интерфейса Android приложения |