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

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

Войти
Регистрация
Восстановить пароль
 
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
#1

Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? - Android

18.06.2015, 11:49. Просмотров 419. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Есть код класса, наследующего Service
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int onStartCommand(Intent intent, int flags, int startId) {
        tTask = new TimerTask() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                sendNotif();
            }
        };
        timer.schedule(tTask, 1000, interval);
        return START_REDELIVER_INTENT;
}
этот класс работает в отдельном потоке. При попытке остановить сервис из другого класса-активити
Java
1
2
3
public void onClickStop(View v) {
        stopService(new Intent(this, MyService.class));
}
сервис еще раз отошлет уведомление через 1-20 секунд.
Вопрос, как сделать так, чтоб из активити можно было сразу остановить сервис без последствий его работы?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2015, 11:49     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке?
Посмотрите здесь:

Android Как из Thread в отдельном классе получить context приложения?
Как сделать так, чтобы AVD увидел файлы ОС linux, на которой девайс был запущен? Android
Android Остановить выполнение кода
Android Реакция активити на событие в сервисе
Android Ошибка потока в сервисе
Буферизация форм в сервисе Android
Android Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
18.06.2015, 12:09     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #2
Ханасака, добрый день!
Подзабыл, кажется, в сервисе есть события, отвечающие за остановку. Внутри можно прописать значение переменной. Соответственно, в таймере надо сделать проверку по этой переменной.
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 12:23  [ТС]     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #3
Цитата Сообщение от CoolMind Посмотреть сообщение
Подзабыл, кажется, в сервисе есть события, отвечающие за остановку. Внутри можно прописать значение переменной. Соответственно, в таймере надо сделать проверку по этой переменной.
Да, думал об этом, но тогда сервис должен каждую секунду проверять, не изменилось ли значение этой переменной, чтоб вызвать метод stopSelf() или stopSelfResult(). Нельзя ли как-то прямо остановить поток или еще чего-то с меньшим подгружанием системы?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
18.06.2015, 13:01     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #4
Ханасака, разве нет?
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class YourService extends Service {
 
    // ...
 
@Override
    public void onDestroy() {
        super.onDestroy();
        stopPlaying();
    }
 
private void stopPlaying() {
    // И т.д.
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 14:20  [ТС]     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #5
Цитата Сообщение от CoolMind Посмотреть сообщение
Ханасака, разве нет?
У меня по такой схеме всё и сделано
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
public class MyService extends Service {
    NotificationManager nm;
    final String LOG_TAG = "myLogs";
    int i = 0;
 
    Timer timer;
    TimerTask tTask;
    long interval = 1000;
 
    @Override
    public void onCreate() {
        super.onCreate();
        timer = new Timer();
    }
    
    @Override
    public void onDestroy() {
        Log.d(LOG_TAG,"onDestroy");
        nm = null;
        timer.cancel();
        super.onDestroy();
    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        tTask = new TimerTask() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                sendNotif();
            }
        };
        timer.schedule(tTask, 1000, interval);
        return START_REDELIVER_INTENT;
    }
 
    void sendNotif() {
        Log.d(LOG_TAG, "running sendNotif!");
        // 1-я часть
        Notification notif = new Notification(R.drawable.ic_launcher,
                "Text in status bar", System.currentTimeMillis());
 
        // 3-я часть
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra(MainActivity.FILE_NAME, "somefile");
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
 
        // 2-я часть
        notif.setLatestEventInfo(this, "Notification's title" + i,
                "Notification's text" + i, pIntent);
 
        // ставим флаг, чтобы уведомление пропало после нажатия
        notif.flags |= Notification.FLAG_AUTO_CANCEL;
        notif.defaults |= Notification.DEFAULT_SOUND;
        // notif.defaults |= Notification.DEFAULT_VIBRATE;
 
        // отправляем
        nm.notify(i, notif);
        nm = null;
        i++;
    }
 
    public IBinder onBind(Intent arg0) {
        return null;
    }
}
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
18.06.2015, 14:26     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ханасака, добавьте в onDestroy установку некоторой переменной в true. А методе sendNotif анализируйте её значение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2015, 14:38     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке?
Еще ссылки по теме:

Android Создание view элементов в отдельном потоке
Android Выполнение кода в отдельном потоке
Android Отзывы о сервисе geekbrains (ru)
Android Как запустить метод в сервисе, в определённое время?
Отрисовка данных в отдельном потоке Android

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

Или воспользуйтесь поиском по форуму:
Ханасака
10 / 10 / 0
Регистрация: 12.07.2013
Сообщений: 147
18.06.2015, 14:38  [ТС]     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? #7
Спасибо, большое!
Решил таким образом: в onDestroy() обнуляю переменную класса interval, а уже затем выполняю timer.cancel(). В sendNotif() первым делом анализирую interval, если он 0, то return. Уведомление не отсылается больше.
Yandex
Объявления
18.06.2015, 14:38     Как отменить выполнение кода в сервисе, который запущен в отдельном потоке?
Ответ Создать тему
Опции темы

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