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

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

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

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

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

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

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

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

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

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

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

Вот, имеет ли смысл вынести эту "процедуру" в класс с сервисом? Или можно из класса activity дергать ее? А если оно закрыто?
Не могу разобраться и понять все равно
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.01.2015, 12:28     Сервис и само приложение #4
http://stackoverflow.com/questions/8...oadcastmanager
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 лучше вообще ничего не тянуть, а все в самом сервсие "тянуть" и проверять и если ок - то выводить сообщение ?

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
Ну, пока где-то так
imbimbimb
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 23
08.01.2015, 15:09  [ТС]     Сервис и само приложение #7
Зачем отдельный "сервис" для запуска такого "таймера"?
Ставь его в onCreate() и удаляй в onDestroy() в Activity.
потому что нужно, чтобы данные постоянно проверялись, даже если приложение закрыто. а это как я понял только через сервис сделать можно.

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

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

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

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

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

https://developer.android.com/traini...arms.html#boot
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(...)
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... Ню-ню...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2015, 19:51     Сервис и само приложение
Еще ссылки по теме:

Неубиваемый сервис Android
Android Сервис не останавливается
Android Не устанавливается сервис
Не выполняется сервис android Android

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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
08.01.2015, 19:51     Сервис и само приложение
Ответ Создать тему
Опции темы

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