Передача данных между экранами Этот пример является простейшим примером вызова другого экрана. Иногда
требуется не только вызвать другой экран активности, но и передать данные,
которые понадобятся в дальнейшем для его работы. Например, имя пользователя,
e-mail и т. д. В этом случае нужно задействовать область extraData в классе Intent.
Эта область представляет собой список параметров ключ-значение, который
передается на новый экран. В качестве ключей в этой области используются
строки, а в качестве значений –примитивные данные.
Для передачи параметров используется метод putExtra(). Новая Activity
должна вызвать подходящий метод: либо getStringExtra(), либо любой подобный,
используя созданный Intent, в качестве объекта для которого вызывается метод.
Выбор метода зависит от того, какой вид данные должны будут принятыв новой
Activity (строковый, целочисленный и т. д.).
Вопросы: 1.
Каким образом осуществляется переход между «окнами» в приложении
на ОСAndroid?
2.
За что отвечает класс Intent в Androidприложении?
3.
Какие типы данных можно передавать через областьextraData в
классеIntent?
Лабораторная работа 10. Организация сервиса в приложении Сервис (service) переводится как служба. Под сервисом будем понимать
некую задачу, которая должна отработать в фоновом режиме и для которой не
нужны элементы пользовательского интерфейса. Сервис может быть запущен и
остановлен как из приложения (Activity), так и из других сервисов. В качестве
примера сервиса можно рассмотреть почтовую программу, где сервис будет
проверять наличие почты и в случае получения новой почты, выдавать
78
нотификацию пользователю. При этом такой сервис можно запустить, и он будет
работать независимо от приложения (Activity). Другими словами, приложение,
которое запустило сервис, может быть уже закрыто, а сервис будет доступен и
будет обрабатывать получение сообщений.
Для примера работы с сервисом нужен минимально необходимый
пользовательский интерфейс (рис. 10.1), код для запуска сервиса (рис. 10.2) и код
самого сервиса (рис.10.3).
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
android:id="@+id/startButton" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:onClick="onClickStart" android:text="@string/start
service">
Пример файла activity_main.xml
package example;
import android.app.Activity; import android.content.Intent; import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity { final String LOG_TAG = "MainActivity";
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.
main );
}
79
public void onClickStart(View v) {
startService(new Intent(this, MyService.class));
}
public void onClickStop(View v) {
stopService(new Intent(this, MyService.class));
}
}
Исходный код активности, запускающей сервис
packageexample;
import android.app.Service; import android.content.Intent; import android.os.IBinder;
import android.util.Log;
public class MyService extends Service { final String LOG_TAG = "MyService"; public
void onCreate() {
super.onCreate(); Log.d(LOG_TAG, "onCreate");
}
public int onStartCommand(Intent intent, int flags, int startId) { Log.d(LOG_TAG,
"onStartCommand");
someTask();
return Service.START_STICKY;
}
public void onDestroy() { super.onDestroy(); Log.d(LOG_TAG, "onDestroy");
}
public IBinder onBind(Intent intent) { Log.d(LOG_TAG, "onBind"); return null;
}
voidsomeTask() {
}
}
Исходный код сервиса
Рассмотрим методы, реализованные в сервисе. Методы onCreate(),
OnDestroy() работают по тому же принципу, что и подобные методы в активности.
Метод onBind(Intentintent) в нашем случае не используется, при этом по умолчанию
он возвращает значение null. Метод onStartCommand(Intentintent, intflags, intstartId)
принимает в качестве аргументов три параметра – это экземпляр интента, флага и
80
id-процесса. Поскольку сервисы запускаются в главном потоке приложения, любые
операции, выполняющиеся в методе onStartCommand(Intentintent, intflags, intstartId),
будут осуществляться в контексте главного потока. Поэтому если требуется
выполнить какие-либо операции в фоновом потоке, его сервис следует запустить из
этого метода. Константа, возвращаемая методом onStartCommand(), может иметь
одно из следующихимен:
START_STICKY –
если
будет
возвращена
эта
константа,
метод
onStartCommand()
будет
вызываться
при
повторном
запуске
сервиса
послепреждевременного завершения работы. Подобный режим используется для
сервисов, которые сами обрабатывают свои состояния. Такие сервисы завершают
свою работу при необходимости. Например, к таким сервисам можно отнести
сервисы, проигрывающиемузыку.
START_NOT_STICKY –
в режиме,
описанном этой константой,
сервисы
запускаются для выполнения отдельных команд. При этом сервисы останавливают
свою работу с использованием метода stopSelf(), как только команда выполнена.
START_REDELIVER_INTENT –
константа,
описывающая
комбинацию
предыдущих двух режимов. Сервис будет запущен повторно только в том случае,
если система преждевременно завершила работу. В случае если сервис завершился
до вызова метода stopSelf(), вызовется обработчик onStartCommand(), который
продолжит обработку события, не завершенную должным образом с предыдущего
раза.
По параметру flags можно узнать, какой тип процесса был запущен.
START_FLAG_REDELIVERY –
константа,
которая указывает,
что параметр
Intent был повторно передан при принудительном завершении работы сервиса
перед явным вызовом метода stopSelf().
START_FLAG_RETRY –
константа,
которая показывает,
что сервис был
запущен после аварийного завершения работы. Данный параметр передается, если
сервис работал в режиме START_STICKY.
Значение параметра flags можно использовать для определения характера
запуска: аварийный или в обычном режиме (рис. 10.4).
81
@Override
public int onStartCommand(Intent intent, int flags, int startId) { if ((flags
& START_FLAG_RETRY) == 0) {
//
Повторный запуск
}
else {
//
Выполнение действий
}
returnService.START_STICKY;
}
Пример метода проверки аварийного завершения работы сервиса
В
случае повторного запуска после аварийного завершения можно выполнить
определенные действия в программе. Если же аварийного случая завершения не
было, можно осуществить запланированные действия в системе.