Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 10:

Сигнал тревоги: запуск приложения в заданное время

< Лекция 9 || Лекция 10 || Лекция 11 >

Регистрация привилегии

При разработке приложений, использующих сигнал тревоги, нужно дать возможность приложнию автоматически запускаться в определенный момент времени, даже если до этого они были закрыты. Они имют возможности таймера, и, следовательно, должны запускать приложение спустя определенное время.

Создайте приложение 'AlarmSample'. Зарегистрируйте привилегию

http://tizen.org/privilege/alarm.set .

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.example.alarm" version="1.0.0">
<profile name="mobile"/>
<ui-application appid="org.example.alarm" exec="alarm" multiple="false" nodisplay="false" taskmanage="true" type="capp">
<label>alarm</label>
<icon>alarm.png</icon>
</ui-application>
<privileges>
<privilege>http://tizen.org/privilege/alarm.set</privilege>
</privileges>
</manifest>

Запуск таймера сигнала тревоги

В этом разделе мы реализуем возможность запуска примера HelloWorld через 3 секунды после нажатия на кнопку. Если приложение HelloWorld еще не было установлено в эмуляторе, вначале инсталлируйте его. Откройте файл исходного кода и внесите в него следующие изменения.

#include "alarmsample.h"
#include <app_alarm.h>
#include <time.h>

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;

int timer_id;
int date_id;
} appdata_s;

app_alarm.h — это файл заголовка библиотеки Alarm.

time.h — это фйл заголовка библиотеки, использующей API, завиящие от времени.

В timer_id, мы введем ID таймера сигнала тревоги. Мы можем завершить сигнал тревоги с его помощью.

Добавьте функцию выше create_base_gui(). Она добавит контролы к контейнеру Box .

static void
my_box_pack(Evas_Object *box, Evas_Object *child,
double h_weight, double v_weight, double h_align, double v_align)
{
/* create a frame we shall use as padding around the child widget */
Evas_Object *frame = elm_frame_add(box);
/* use the medium padding style. there is "pad_small", "pad_medium",
* "pad_large" and "pad_huge" available as styles in addition to the
* "default" frame style */
elm_object_style_set(frame, "pad_medium");
/* set the input weight/aling on the frame insted of the child */
evas_object_size_hint_weight_set(frame, h_weight, v_weight);
evas_object_size_hint_align_set(frame, h_align, v_align);
{
/* tell the child that is packed into the frame to be able to expand */
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* fill the expanded area (above) as opposaed to center in it */
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
/* actually put the child in the frame and show it */
evas_object_show(child);
elm_object_content_set(frame, child);
}
/* put the frame into the box instead of the child directly */
elm_box_pack_end(box, frame);
/* show the frame */
evas_object_show(frame);
}

Добавим код, создающий кнопку в конец функции create_base_gui().

/* Conformant */
ad->conform = elm_conformant_add(ad->win);
elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(ad->win, ad->conform);
evas_object_show(ad>conform);

{
/* child object - indent to how relationship */
/* A box to put things in verticallly - default mode for box */
Evas_Object *box = elm_box_add(ad->win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
{
/* child object - indent to how relationship */

/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<align=center>Using of Alarms</>");
/* expand horizontally but not vertically, and fill horiz,
* align center vertically */
my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.5);

/* Button-1 */
Evas_Object *btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Start Timer Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_start_timer_cb, ad);
/* epand both horiz and vert, fill horiz and vert */
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);
}
}

/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Добавим обработчик нажатия кнопки выше функции create_base_gui().

static void
btn_start_timer_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
int ret;
int DELAY = 3;
int REMIND = 0;
app_control_h app_control = NULL;
ret = app_control_create(&app_control);
ret = app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
ret = app_control_set_app_id (app_control, "org.example.helloworld");
ret = alarm_schedule_after_delay(app_control, DELAY, REMIND, &ad->timer_id);
dlog_print(DLOG_DEBUG, "tag", "result = %d", ret);
elm_object_text_set(ad->label, "Timer Alarm Started");
}

app_control_h — это структура AppControl .

app_control_create(app_control_h *) - это API, который создает объект AppControl.

app_control_set_operation(app_control_h, char *) - это API, который определяет роль AppControl.

Для загрузки внешнего приложения используйте в качестве параметра APP_CONTROL_OPERATION_DEFAULT.

app_control_set_app_id(app_control_h, char *) - это API, который определяет имя сборки примера, который должен быть загружен в AppControl. Имя сборки примера HelloWorld - "org.example.helloworld."

alarm_schedule_after_delay(app_control_h, int, int, int *) - это API, который передает AppControl событие после того, как прошло определенное количество времени.

Второй параметр показывает временной итервал для первого выполнения, а третий параметр показывает временной интервал повторных запусков. Если мы введем 0, то событие запустится только одина раз. Етвертый парамтр принимает ID сигнала тревоги, который необходим для завешения сигнала тревоги.

Запустите пример. Нажмите на кнопку. Риложение HelloWorld запустится спустя три секунды.


Завершение таймера сигнала тревоги

В этом разделе мы реализуем возможность добавления кнопки к приложению Alarm и завершению сигнала тревоги. Добавьте новый код в конец функции create_base_gui().

/* Button-1 */
Evas_Object *btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Start Timer Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_start_timer_cb, ad);
/* epand both horiz and vert, fill horiz and vert */
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);

/* Button-2 */
btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Stop Timer Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_stop_timer_cb, ad);
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);

}
}

Далее, создайте обработчик нажатия кнопки выше функции create_base_gui() и модифицируйте функцию btn_start_timer_cb().

static void
btn_start_timer_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
int ret;
int DELAY = 3;

//int REMIND = 0;
int REMIND = 8;

app_control_h app_control = NULL;
ret = app_control_create(&app_control);
ret = app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
ret = app_control_set_app_id (app_control, "org.example.helloworld");
ret = alarm_schedule_after_delay(app_control, DELAY, REMIND, &ad->timer_id);
dlog_print(DLOG_DEBUG, "tag", "result = %d", ret);
elm_object_text_set(ad->label, "Timer Alarm Started");
}

static void
btn_stop_timer_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
alarm_cancel(ad->timer_id);
elm_object_text_set(ad->label, "Timer Alarm Stopped");
}

Изменение значения переменной REMIND на 8 апускает приложение HelloWorld каждые восемь секунд.

btn_stop_timer_cb() - это функция, которая останавливает таймер сигнала тревоги, когда пользователь нажимает на кнопку.

alarm_cancel(int alarm_id) - это API, который останавливаетсигнал тревоги. Она передает ID сигналу тревоги.

Запустите приложение снова и нажмите первую кнопку. Зпрустится приложение HelloWorld. Завершите приложение HelloWorld. Оно будет запускаться каждые восемь секунд. Нажмите на вторую кнопку, приложение HelloWorld больше не будет запускаться: сигнал тревоги был завершен.

Для завершения сигнала тревоги нужен его ID. Следовательно, если вы запустили сигнал тревоги, вам нужно завершить сигнал тревоги нажатием на вторую кнопку. Если пример HelloWorld продолжает запускаться, даже если вы нажали на вторую кнопку, удалите ваш эмулятор и создайте его снова. Это перезагрузит его.


Сигнал тревоги по дате

Мы реализуем функцию запуска определенного приложения в заданное время. Добавьте код создания двух кнопок в функции create_base_gui().

/* Button-2 */
btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Stop Timer Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_stop_timer_cb, ad);
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);

/* Button-3 */
btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Start Date Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_start_date_cb, ad);
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);

/* Button-4 */
btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Stop Date Alarm");
evas_object_smart_callback_add(btn, "clicked", btn_stop_date_cb, ad);
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);

}
}

Затем добавьте два обработчика нажатия кнопок выше функции create_base_gui().

static void
btn_start_date_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
int ret;
struct tm date;
ret = alarm_get_current_time(&date);
date.tm_sec+=4;
app_control_h app_control = NULL;
ret = app_control_create(&app_control);
ret = app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
ret = app_control_set_app_id (app_control, PACKAGE);
ret = alarm_schedule_at_date(app_control, &date, 0, &ad->date_id);
elm_object_text_set(ad->label, "Date Alarm Started");
}
static void
btn_stop_date_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
alarm_cancel(ad->date_id);
elm_object_text_set(ad->label, "Date Alarm Stopped");
}

btn_start_date_cb() - это функция, создающая сигнал тревоги по дате.

struct tm — это структура времени, в которой сохраняются дата и время.

alarm_get_current_time(struct tm *) - это API, который возвращает текущее время в структуру tm type.

В tm.tm_sec время сохраняется в секундах. Мы задали время выполнения как 4 секунды после текущего времени.

alarm_schedule_at_date(app_control_h, struct tm *, int, int *) - это API, который возвращает событие AppControl в заданное время.

btn_stop_date_cb() - это функция, которая завершает Date Alarm.

Запустите приложение. Нажмите на третью кнопку и закройте приложение и пример запустится снова. В это же время нажмите на третью кнопку и затем на четвертую кнопку сразу после. Затем закройте приложение и вы увидите, что изменений не произошло. Это означает, что приложение Date Alarm было остановлено.


< Лекция 9 || Лекция 10 || Лекция 11 >
Тимур Имашев
Тимур Имашев
Россия, Кемерово, КемГИК
Александр Бураков
Александр Бураков
Россия, г.Тюмень, Тюменская область