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

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

Войти
Регистрация
Восстановить пароль
 
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
#1

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

08.01.2015, 07:44. Просмотров 810. Ответов 12
Метки нет (Все метки)

Возник вот такой вопрос.

Есть приложение, которое делает кое-какие расчеты.
Мне нужно делать push уведомление, когда приложение получает результат (берет из интернета из xml ленты).
Как я понимаю, для этого требуется запускать отдельный сервис, который будет все время работать в фоновом режиме, и при нужных нам условиях слать push уведомление локальное.

Вопросы собственно такие:

1. Есть класс сервиса, к примеру class test_service extends Service. Есть MainActivity. Там есть несколько процедур. Как к ним обратиться из сервиса. Также могу ли я обращаться к элементам MainActivity из запущенного сервиса, т.е. к примеру к TextView и т.п.
2. Сервис запускается - при запуске самого приложения в событие onCreate mainactivity. Далее если мы выйдем из приложения, по идеи же сервис останется запущенным. Но как обращаться к элементам Activity? Или же стоит переписывать логику работы так, чтобы туда не обращаться ) ? Например в классе Mainactivity - у меня по таймеру парсятся данные из xml ленты, вот эти данные мне и нужны

Надеюсь на помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2015, 07:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сервис и само приложение (Программирование Android):

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

Допиленное узкоспециализированное приложение или неповоротливое многофункциональное приложение? - Программирование Android
Если вопрос про "что нужно знать?" висит, то и этот должен зайти. Появилась дилемма при выборе идеи для приложения, хочу узнать Ваше...

Узнать приложение которое запустило моё приложение - Программирование Android
Приветствую всех! Помогите разобраться. Есть ли возможность узнать, что за приложение запустило моё приложение? т.е. к примеру мою...

Не устанавливается сервис - Программирование Android
Возникла такая проблема: имеется приложение в котором есть только сервис (Activity нету). Если его запустит, то как я понимаю оно должно...

Сервис уведомлений - Программирование Android
Всем доброго времени суток. Возникла такая задача: Приложение позволяет занести какую-то задачу на день на определённое время. Нужно,...

Сервис не останавливается - Программирование Android
Вот активити по нажатию на кнопку Start запускает сервис import android.content.Intent; import android.os.Bundle; import...

12
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 12:13 #2
Буду краток
Interface
BroadcastReceiver или LocalBroadcastManager
0
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 12:21  [ТС] #3
Благодарю, но не совсем понятно.
Если бы вы мне объяснили следующее был бы очень вам признателен.

К примеру в MainActivity у нас есть процедура, которая берет данные из xml ленты и помещает в TextView.
В сервисе мне нужно проверять то, что приходит из это xml ленты, и если число выше определенной суммы - шлем push сообщение.

Вот, имеет ли смысл вынести эту "процедуру" в класс с сервисом? Или можно из класса activity дергать ее? А если оно закрыто?
Не могу разобраться и понять все равно
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 12:28 #4
http://stackoverflow.com/questions/8...oadcastmanager
0
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 12:53  [ТС] #5
Благодарю.

Теперь поправьте меня.

1. При запуске приложения запускаем отдельный сервис.
2. В сервисе запускаем alarm.SetAlarm(YourService.this);
3.
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
public class Alarm extends BroadcastReceiver 
    {    
         @Override
         public void onReceive(Context context, Intent intent) 
         {   
             здесь проверяем соединение с интернетом, если есть - тянем данные, проверяем, если условия совпадают - то шлеп push сообщение
 
         }
 
     public void SetAlarm(Context context)
     {
         AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, Alarm.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); - указываем время повторения, через 10 минут
     }
 
     public void CancelAlarm(Context context)
     {
         Intent intent = new Intent(context, Alarm.class);
         PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.cancel(sender);
     }
 }
Правильно ли я понимаю?
Т.е. в моем случае из activity лучше вообще ничего не тянуть, а все в самом сервсие "тянуть" и проверять и если ок - то выводить сообщение ?

0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 15:00 #6
Зачем отдельный "сервис" для запуска такого "таймера"?
Ставь его в onCreate() и удаляй или в onDestroy() в Activity, ну или по тыку на какую-то кнопку или меню.
И, кстати, если PendingIntent тебе не нужен после закрытия приложения, то не мешало бы убивать и sender тоже ибо сказано в святом писании
This means that, even if its owning application's process is killed, the PendingIntent itself will remain usable
Ну, пока где-то так
1
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 15:09  [ТС] #7
Зачем отдельный "сервис" для запуска такого "таймера"?
Ставь его в onCreate() и удаляй в onDestroy() в Activity.
потому что нужно, чтобы данные постоянно проверялись, даже если приложение закрыто. а это как я понял только через сервис сделать можно.

т.е. мы проверяем данные - и если есть то, что нам нужно - из сервиса шлем Push сообщение

Добавлено через 6 минут
просто сам вопрос еще был в том, как обратиться к методу закрытого activity
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 15:16 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
*это как я понял только через сервис сделать можно*
Не совсем правильно ты понял или не дочитал.
Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running.
Добавлено через 2 минуты
Цитата Сообщение от imbimbimb Посмотреть сообщение
просто сам вопрос еще был в том, как обратиться к методу закрытого activity
как можно заставить мертвеца пошевелиться?

Добавлено через 3 минуты
Цитата Сообщение от Armagedo Посмотреть сообщение
И, кстати, если PendingIntent тебе не нужен после закрытия приложения
прошу читать, как

И, кстати, если PendingIntent тебе не нужен после удаления "таймера"
Зарапортавался, сорри
1
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 15:28  [ТС] #9
спасибо!
Т.е. если я аларм запущу с интервалом в 30 минут, и в нем буду обрабатывать все что мне нужно - тянуть данные из xml ленты, пушить сообщения, если даныне совпадают и т.п. - все это будет работать пи "закрытом" приложение?

А как быть при старте телефона (рестарт) - тут получается уже только через сервис, который запускается вмсете с телефоном ? ?
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 15:44 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от imbimbimb Посмотреть сообщение
Т.е. если я аларм запущу с интервалом в 30 минут, и в нем буду обрабатывать все что мне нужно - тянуть данные из xml ленты, пушить сообщения, если даныне совпадают и т.п. - все это будет работать пи "закрытом" приложение?
Да, только еще нужно "зарегистрировать" твой класс-ресивер в манифесте.

Правда я не до конца (или вообще) не понимаю, что такое push сообщение в андроидовских терминах...

Цитата Сообщение от imbimbimb Посмотреть сообщение
А как быть при старте телефона (рестарт) - тут получается уже только через сервис, который запускается вмсете с телефоном ? ?
Ты читать документацию собираешься?

https://developer.android.com/training/scheduling/alarms.html#boot
1
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 19:01  [ТС] #11
Благодарю )
Со всем разобрался, теперь приступаю к реализации

Добавлено через 3 часа 3 минуты
дабы не создавать новую тему, напишу вопрос сюда.
Если есть элементарные вещи - извините, с Java и под андроид начал совсем недавно.

итак, в целом - с алармом разобрался, но, возник такой вот вопрос:

1. В mainactovity вызываю alarm

Java
1
2
Alarm alarm = new Alarm();
        alarm.SetAlarm(MainActivity.this);
2. Код класса Alarm

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
public class Alarm extends BroadcastReceiver 
{    
    
    NotificationManager NM;
 
     @Override
     public void onReceive(Context context, Intent intent) 
     {   
      
        Notify("test"+System.currentTimeMillis(), context);
         //собственно и шлем push сообщение
 
     }
 
     public void Notify(String test, Context context)
     {
         Intent intent = new Intent(context, Alarm.class);      
       PendingIntent contentIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        NotificationCompat.Builder b = new NotificationCompat.Builder(context);
 
        b.setAutoCancel(true)
         .setDefaults(Notification.DEFAULT_ALL)
         .setWhen(System.currentTimeMillis())         
         .setSmallIcon(R.drawable.ic_launcher)
         .setTicker(test)            
         .setContentTitle("test")
         .setContentText("test text")
         .setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND)
         .setContentIntent(contentIntent)
         .setContentInfo("Info");
 
 
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, b.build());
     }
 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, Alarm.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10000, pi); // Millisec * Second * Minute
 }
 
 public void CancelAlarm(Context context)
 {
     Intent intent = new Intent(context, Alarm.class);
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
     alarmManager.cancel(sender);
 }
}
3. В андроид манифест зарегистрировал свой ресивер
Java
1
2
3
4
5
        <receiver  android:process=":remote" android:name="Alarm">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                </intent-filter>
        </receiver>
Добавил права:

Java
1
2
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
теперь сами вопросы:

1. Push сообщенеи отправляется, все ок, но при шелчке по нему - не открывается само приложение. В чем косяк?
2. Аларм работает и после закрытия приложения, и после перезагрузки. НО, после рестарта - он работает пару раз и потом перестает, в чем может быть дело? Может запускать все таки в виде сервиса? Ведь если приложение вылетит по ошибке - работа остановится, если будет сервис - он перегрузится и дальше будет работать?

Добавлено через 3 минуты
push отправляется Notify(...)
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 19:16 #12
Надо танцевать пробовать по писанному...

+ Зачем параметр androidrocess=":remote" ?
+ Куда делась точка перед именем класса в android:name?
+ Надо почитать надо ли добавить атрибут android:enabled="true" для ресивера...

P.S. Ты так и не убиваешь sender в CancelAlarm... Ню-ню...
0
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 19:51  [ТС] #13
по умолчанию стоит true уже
точку добавил

Код
android:enabled
    Whether or not the activity can be instantiated by the system — "true" if it can be, and "false" if not. The default value is "true".

    The <application> element has its own enabled attribute that applies to all application components, including activities. The <application> and <activity> attributes must both be "true" (as they both are by default) for the system to be able to instantiate the activity. If either is "false", it cannot be instantiated
0
08.01.2015, 19:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2015, 19:51
Привет! Вот еще темы с ответами:

Сервис уведомлений - Программирование Android
Привет. Нужна помощь в создании уведомлений из сервиса. В приложение поступают данные с сервера get-запросом, хочу, чтобы приложение...

Неубиваемый сервис - Программирование Android
Как запустить сервис из активити и сделать так чтобы он не умерал вместе с активностью/приложением?

Узнать запущен ли сервис - Программирование Android
Я хочу из приложения запускать сервис. Но чтобы не запускать его дважды мне как то надо узнать запущен ли он уже или нет. Подскажите как...

Не выполняется сервис android - Программирование Android
Приветствую. Пытаюсь запустить сервис. Делаю так package com.qwe.threadService; import android.content.Intent; import...


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

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

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