Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
obrazer
71 / 71 / 3
Регистрация: 04.09.2012
Сообщений: 170
#1

Использование Сервисов

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

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

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

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

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

Ну как-то так

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

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

PS: Возможно слегка сумбурно объяснил, если непонятно - спрашивайте, буду корректировать мысль.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 00:15
Ответы с готовыми решениями:

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

Обьясните работу сервисов в fcm
Задался вопросом, как работают собственно push-уведомления. В Android, чтобы...

Push уведомления без сторонних сервисов
Есть форма php, на которой располагается одна кнопка, при нажатии на эту кнопку...

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

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

28
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 14:37 #21
а как вы запускаете сервис?

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

Добавлено через 3 часа 52 минуты
взял пример с документации - http://developer.android.com/guide/components/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;
    }
}
раз в секунду пишет в логи и слип никак не влияет....
0
obrazer
71 / 71 / 3
Регистрация: 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 секунд не страшно, главное чтоб оно все работало в фоне.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.02.2013, 21:27 #27
даже без сна и сервисов будут отличия(например за 60 сек может насчитать 58), поэтому и писал вначале вычитать время старта от текущего если вам нужно время от запуска...
0
obrazer
71 / 71 / 3
Регистрация: 04.09.2012
Сообщений: 170
12.02.2013, 21:35  [ТС] #28
Цитата Сообщение от V0v1k Посмотреть сообщение
если вам нужно время от запуска...
Не, время мне совсем не нужно, Подсчетом тиков я просто хотел проверить выполнение в фоне.
Однако поток в Сервисе я создавал с помощью AsyncTask. Сейчас переделаю на Thread и попробую поиграться с приоритетами. Если будет работать чаще чем раз в минуту (как это у меня получилось в последнем эксперименте и что видно из логов), то буду считать механизм подходящим.

Запрещать системе убивать сервис уже научился.
0
V0v1k
1160 / 984 / 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 Посмотреть сообщение
отсчет-то идет, но нифига не ровно
может просто панелька с логами скролится не ровно?)
0
12.02.2013, 21:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 21:44

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

Docker запуск сервисов
Всем привет, у меня есть несколько контейнеров с линухами, проблема в том что...

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


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

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