Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
#1

Использование Сервисов - Программирование Android

07.02.2013, 00:15. Просмотров 2892. Ответов 28
Метки нет (Все метки)

Итак задача:
1. Сервис работает с неким сервером в сети и постоянно запрашивает у того некоторые данные.
2. Данные есть критичные и некритичные
3. Если запущено приложение, то данные отображаются в нем (все сразу или частично, пока не существенно)
4. Если приложение свернуто или вообще убито системой или девайс спит и т.д. и тп., то если Сервис получил критичные данные, должен разбудить девайс, добавить Уведомление в состояние, поднять приложение, ну и приложение получает данные для отображения.

Собственно мысли:
1. Сервис у меня уже работает и данные с сервера тягает.
2. Сделал BroadcastReceiver, Сервис туда отправляет Intent с содержанием полученных данных
3. BroadcastReciever внутри себя определяет критичность данных и при необходимости выводит Уведомление и...

Вот тут вопрос. Как данные отобразить в приложении?

Т.е. по сути объект BroadcastReceiver является частью приложения.
1. Могу ли я быть уверен, что если приложение было в Паузе или вообще в Стопе, то после вызова BroadcastReciever оно уже снова запущено с последнего Активити?
2. BroadcastReceiver один, а Активити в приложении может быть много. Каким образом мне запоминать значения всех полученных данных, чтобы при перемещении между Активити можно было потом эти данные отобразить? Где их лучше сохранить?
3. Аналогично с Уведомлениями. Появилось Уведомление с данными, а приложение-то свернуто. Тыкаем в Уведомление, приложение разворачивается, а как передать данные в приложение как будто оно было развернуто?

Ну как-то так

Пробежала мысль не париться и сделать чтобы Сервис сохранял все что получает в БД и просто вызывает BroadcastReceiver. А приложение при активации просто читает из БД актуальные данные. Т.е. Оно читает данные при активации при получении BroadcastReceiver, при развертывании через Уведомление.

Однако такой способ меня как-то смущает, ибо связь с сервером будет с периодичностью 5-10 секунд, и получается постоянная работа с БД. Насколько это ресурсоемкая операция? Вообще нормальый ли будет такой подход.

PS: Возможно слегка сумбурно объяснил, если непонятно - спрашивайте, буду корректировать мысль.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 00:15     Использование Сервисов
Посмотрите здесь:

Гуру, Теория сервисов - Программирование Android
Гуру, Помогите! Перечитал уроки, основы понял, но суть ускользает. ТАКИХ нюансов в уроках нет... скорее инструкции чем понимание... ...

Push уведомления без сторонних сервисов - Программирование Android
Есть форма php, на которой располагается одна кнопка, при нажатии на эту кнопку на мобильный телефон (android) должно прийти push...

Как получить приблизительное местоположение пользователя без использования сервисов Google? - Программирование Android
Добрый день, Никак не могу войти под старым ником, поэтому вновь зарегистрировался. Возник вопрос о геолокации. Суть в следующем....

Использование голосовых сервисов Google в своих целях - JavaScript
Всем привет. Два вопроса тут возникло по теме топика: 1) Как известно легко можно использовать голосовой ввод от Google в своих целях. Я...

Компонент платежных сервисов - Joomla
Прива! Ребзя, нужна ваша помошь! Время терпит, но душа не имеет покоя... Проблема вот в чем. Компонент (фри-версия прилагается) пришлось...

Удаление Гугл - сервисов - Android
Здравствуйте. Телефон - Yotaphone 2. Версия андроида - 4.4.3 Вопрос такой, как лучше удалить сервисы, приложения, библиотеки...

База данных сервисов - C++ WinAPI
Здравствуйте. Объясните пожалуйста,что такое база данных сервисов.Знаю что сервис получает к ней доступ,но что это такое и где она...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 10:07  [ТС]     Использование Сервисов #16
Опробовал. Появились новые вопросы.
1. Когда устройство засыпает - сервис останавливается. Т.е. у меня создан сервис, в котором создается отдельный поток, который просто считает секунды. В итоге он все считает пока не заснет. Минут через 20 будишь девайс, а он всего пару минут насчитал. Т.е. пока не спит - считает, как девайс заснул, так и сервис встал.
Видел пример с АлярмМенеджером, но тот в свою очередь работает в итоге самостоятельно. А надо чтобы сервис все отрабатывал. Как сделать чтоб Сервис постоянно работал (ну например приложение Майл.ру постоянно почту мониторит)?
2. Сервис прибивается системой. Я вообще предполагал, что сервис на то и сервис, что бы работать в фоне. А тут оставил на ночь - утром все запустилось с начала, причем специально делал эксперимент - оставил открытым именно мое приложение (там уже было насчитано несколько минут работы), устройство заснуло, утром разбудил, открылось мое же приложение, но "с нуля".

В итоге все для чего мне нужны были сервисы не работает. А именно - в фоне не работает, при неактивности прибивается системой...

Как-то делал запуск отдельного потока непосредственно из активити. Так результат был аналогичный. Так же при неактивной активити поток работал самостоятельно, при засыпании устройства поток останавливался, система могла прибить активити вместе с потоком. А нафига тогда сервисы?

Как так? Что не так? Как быть? Чего я недопонял?

PS: Взаимодействие Сервиса, Активити, Нотификейшенов и прочее, выше мною описанное, работает нормально
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 13:02     Использование Сервисов #17
в активити есть методы для сохранения и восстановления состояния (onSaveInstanceState/onRestoreInstanceState).
время нужно рассчитывать вычитанием текущего времени от времени старта, а не считать каждую секунду.
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 13:14  [ТС]     Использование Сервисов #18
Цитата Сообщение от V0v1k Посмотреть сообщение
в активити есть методы для сохранения и восстановления состояния (onSaveInstanceState/onRestoreInstanceState).
А при чем тут сохранение состояния если (цитирую себя же) - "В итоге все для чего мне нужны были сервисы не работает. А именно - в фоне не работает, при неактивности прибивается системой..."

Цитата Сообщение от V0v1k Посмотреть сообщение
время нужно рассчитывать вычитанием текущего времени от времени старта, а не считать каждую секунду.
Время я считал просто для проверки активности сервиса. И полученное количество тиков говорит мне о том, что... см. предыдущий мой пост.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 14:02     Использование Сервисов #19
ну, будильник как-то включается даже если девайс спит...

Добавлено через 4 минуты
ну нагуглил я никаких упоминаний о том, что сервис не работает когда девайс засыпает.
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 14:10  [ТС]     Использование Сервисов #20
Будильник включается посредством АлармМенеджера. Это немного другой механизм нежели мне нужен
Цитата Сообщение от V0v1k Посмотреть сообщение
никаких упоминаний о том, что сервис не работает когда девайс засыпает.
Вот я тоже ненагуглил, но счетчик не работает, а значит сервис не работает. Походу придется запрещать девайсу спать.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 14:37     Использование Сервисов #21
а как вы запускаете сервис?

Добавлено через 4 минуты
мой тим подтвердил что сервис не стопается когда девайс переходит в слип.
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 14:54  [ТС]     Использование Сервисов #22
Цитата Сообщение от V0v1k Посмотреть сообщение
а как вы запускаете сервис?
startService, как я понимаю, у Активити.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 15:10     Использование Сервисов #23
может у вас в onPause/onDestroy вызывается stopService?
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 15:17  [ТС]     Использование Сервисов #24
нет, stopService делается только явно по кнопке.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 19:20     Использование Сервисов #25
ну подебагайте, не знаю что еще посоветовать.

Добавлено через 3 часа 52 минуты
взял пример с документации - http://developer.android.com/guide/c.../services.html
немножко изменил
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.example.wrtest;
 
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
 
public class MyService extends Service {
 
    private Looper mServiceLooper;
    private ServiceHandler mServiceHandler;
 
    private int i = 0;
 
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
 
    // Handler that receives messages from the thread
    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }
 
        @Override
        public void handleMessage(Message msg) {
            while (true) {
                synchronized (this) {
                    try {
                        wait(1000);
                        i++;
                        Log.v("llloooggg", String.valueOf(i));
                    } catch (Exception e) {
                    }
                }
            }
        }
    }
 
    @Override
    public void onCreate() {
        // Start up the thread running the service. Note that we create a
        // separate thread because the service normally runs in the process's
        // main thread, which we don't want to block. We also make it
        // background priority so CPU-intensive work will not disrupt our UI.
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
                android.os.Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
 
        // Get the HandlerThread's Looper and use it for our Handler
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
 
        // For each start request, send a message to start a job and deliver the
        // start ID so we know which request we're stopping when we finish the
        // job
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        mServiceHandler.sendMessage(msg);
 
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }
}
раз в секунду пишет в логи и слип никак не влияет....
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 20:59  [ТС]     Использование Сервисов #26
Цитата Сообщение от V0v1k Посмотреть сообщение
раз в секунду пишет в логи и слип никак не влияет....
Ага, опробовал - действительно пишет.
А потом опробовал свой код - так же пишет в лог во время сна.
Однако когда устройство не подключено к компьютеру, запустить приложение, то после подключения к компьютеру
лог имеет следующий вид:
Код
02-12 20:44:06.884: V/Alarm(30008): 60
02-12 20:44:07.884: V/Alarm(30008): 61
02-12 20:44:08.894: V/Alarm(30008): 62
02-12 20:44:09.884: V/Alarm(30008): 63
02-12 20:44:10.894: V/Alarm(30008): 64
02-12 20:44:11.014: W/IInputConnectionWrapper(30008): beginBatchEdit on inactive InputConnection
02-12 20:44:11.014: W/IInputConnectionWrapper(30008): endBatchEdit on inactive InputConnection
02-12 20:44:11.054: W/IInputConnectionWrapper(30008): beginBatchEdit on inactive InputConnection
02-12 20:44:11.054: W/IInputConnectionWrapper(30008): endBatchEdit on inactive InputConnection
02-12 20:44:11.894: V/Alarm(30008): 65
02-12 20:44:12.894: V/Alarm(30008): 66
02-12 20:44:15.505: V/Alarm(30008): 67
02-12 20:44:16.505: V/Alarm(30008): 68
02-12 20:44:17.515: V/Alarm(30008): 69
02-12 20:44:36.504: V/Alarm(30008): 70
02-12 20:44:37.504: V/Alarm(30008): 71
02-12 20:44:38.504: V/Alarm(30008): 72
02-12 20:45:08.514: V/Alarm(30008): 73
02-12 20:45:09.514: V/Alarm(30008): 74
02-12 20:45:10.534: V/Alarm(30008): 75
02-12 20:45:11.544: V/Alarm(30008): 76
02-12 20:45:12.544: V/Alarm(30008): 77
02-12 20:45:36.544: V/Alarm(30008): 78
02-12 20:45:37.554: V/Alarm(30008): 79
02-12 20:45:38.554: V/Alarm(30008): 80
02-12 20:46:37.525: V/Alarm(30008): 81
02-12 20:46:38.525: V/Alarm(30008): 82
02-12 20:46:39.525: V/Alarm(30008): 83
02-12 20:47:36.565: V/Alarm(30008): 84
02-12 20:47:37.565: V/Alarm(30008): 85
02-12 20:47:38.565: V/Alarm(30008): 86
02-12 20:47:46.797: V/Alarm(30008): 87
лог с момента запуска удалил, потому как там запуск и отсчет каждую секунду (т.е. все нормально)
"02-12 20:44:11.014: W/IInputConnectionWrapper(30008): beginBatchEdit on inactive InputConnection" - это момент ухода в сон, не знаю что это за хрень.
И ниже пошел отсчет с перебоями. И, что самое интересное, отсчет-то идет, но нифига не ровно. Может вопрос в приоритетности и реалтаймности во время сна? Если вопрос только в этом, то это становится достаточно не критично, потому как отставание на 10-15 секунд не страшно, главное чтоб оно все работало в фоне.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 21:27     Использование Сервисов #27
даже без сна и сервисов будут отличия(например за 60 сек может насчитать 58), поэтому и писал вначале вычитать время старта от текущего если вам нужно время от запуска...
obrazer
70 / 70 / 1
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 21:35  [ТС]     Использование Сервисов #28
Цитата Сообщение от V0v1k Посмотреть сообщение
если вам нужно время от запуска...
Не, время мне совсем не нужно, Подсчетом тиков я просто хотел проверить выполнение в фоне.
Однако поток в Сервисе я создавал с помощью AsyncTask. Сейчас переделаю на Thread и попробую поиграться с приоритетами. Если будет работать чаще чем раз в минуту (как это у меня получилось в последнем эксперименте и что видно из логов), то буду считать механизм подходящим.

Запрещать системе убивать сервис уже научился.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 21:44     Использование Сервисов
Еще ссылки по теме:

Блокировка поисковых сервисов - JavaScript
Здравствуйте! Заранее извиняюсь если подобная тема обсуждалась (не нашел). Дело вот в чем: Есть сайт с движком друпала, на нем модуль...

Переводчик с использованием различных сервисов - PHP
Здравствуйте. Мне нужно создать аналог гугл онлайн переводчика, то есть одностраничный сайт с двумя формами, в одной пишешь на русском,...

Порядок загрузки драйверов и сервисов - PowerShell
Дарова! Есть ли возможность в поше узнать порядок загрузки сервисов и дров, как это реализовано в лодордере от сисинтерналс? Если да, как...

Пример использования сервисов Twitter - C#
Всем привет, может кто-то использовал сервисы которые предоставляет твиттер? например GET trends/place ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 21:44     Использование Сервисов #29
Цитата Сообщение от obrazer Посмотреть сообщение
"02-12 20:44:11.014: W/IInputConnectionWrapper(30008): beginBatchEdit on inactive InputConnection" - это момент ухода в сон, не знаю что это за хрень.
а у меня такие логи при уходе в сон
02-12 19:34:54.323: D/OpenGLRenderer(17712): Flushing caches (mode 0)
02-12 19:34:54.378: D/OpenGLRenderer(17712): Flushing caches (mode 1)

Добавлено через 8 минут
Цитата Сообщение от obrazer Посмотреть сообщение
отсчет-то идет, но нифига не ровно
может просто панелька с логами скролится не ровно?)
Yandex
Объявления
12.02.2013, 21:44     Использование Сервисов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru