Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705

Foreground service, context null после закрытия главного окна программы

13.06.2022, 19:10. Показов 966. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть Foreground service который создает Notifiction в statusbar, я его запускаю, и потом запускаю таймер который просто каждых 2 секунды обновляет сообщение в статусбаре.

Контекст я передаю в методе инициализации сервиса:

Java
1
2
3
4
5
    public static boolean init(Context context) {
        if (initialized) return false;
        MyForegroundService.context = context;
        return initialized = true;
    }
Вызываю сначала
Java
1
MyForegroundService.init(SettingsActivity.this)
Ну и потом запускаю сервис и таймер
Java
1
MyForegroundService.startService()
и вот когда я закрываю главное окно программы, то через минут 5 мой сервис крешится с сообщением "java.lang.RuntimeException: Unable to start receiver com.mypackage.services.NotificationRecei ver: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName() ' on a null object reference"

На сколько я понимаю после того как я закрываю главный экран то через некоторые время очищается память и мой контекст стает равен null. Как мне сделать что бы контекст приложения всегда был сохранен и я мог его использовать в любом методе, включая статические, и он ни когда не очищался даже если я закрыл главный экран приложения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2022, 19:10
Ответы с готовыми решениями:

Сохранение списка в обработчике закрытия главного окна программы
Определен обработчик закрытия окна - g_signal_connect (G_OBJECT (d.window), "destroy", G_CALLBACK(gtk_main_quit), NULL); ...

Сделать button главного окна активным(!), после закрытия дочернего через кнопку
Всем привет! У меня есть форма, которая открывается при нажатии кнопки и после кнопка становится не активной. Я хочу, чтобы, после...

Как сделать так, чтобы Service работал после закрытия программы
Здравствуйте! Никак не могу разобраться, как сделать так, чтобы Service работал после закрытия программы. Вот что я написал в...

9
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
13.06.2022, 22:03
Зачем передавать контекст в сервис? Он сам по себе уже контекст.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
13.06.2022, 22:26  [ТС]
vs2019, Потому что я запускаю сервис статическим методом.
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
public class MyForegroundService extends Service {
 
...........
 
    public static void startTimer() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                try {
                    starService(getstringData());
                } catch (Exception ignored) { }
            }
        }, 0, 2000);
        isTimerStarted = true;
    }
 
    public static void starService(String actionMessage) {
        Intent serviceIntent = new Intent(context, MyForegroundService.class);
        serviceIntent.putExtra("action", actionMessage);
        ContextCompat.startForegroundService(context, serviceIntent);
 
        if (isTimerOn && !isTimerStarted) {
            startTimer();
        }
    }
}
Из главного активити запускаю сервис
Java
1
MyForegroundService.starService("Started")
Потом закрываю главное окно программы, все нормально работает несколько минут и потом все прекращает работать, и пишет что контекст равен null.
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
13.06.2022, 22:36
И каким образом ответ "Потому что я запускаю сервис статическим методом." отвечает на вопрос, зачем передавать контекс в сервис? Сервис сам по себе контекст.
Закрывается Активити? И пусть закрывается. Используйте контекст который сервиса. Сервис-то не закрывается?
Или у Вас и сервис тоже закрывается?
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
13.06.2022, 23:08  [ТС]
vs2019, А как мне в статическом методе использовать контекст сервиса? Можно пример кода что бы я понимал о чем Вы говорите?

А по замерам то получаться следующее:
Запускаю я сервис в 18:53
Закрываю активити
Он работает все нормально
И в 18:57, в дебагере Андроид студии пишет что главный процесс "DEAD"
И сервис перестает отправлять сообщения
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
13.06.2022, 23:29
Цитата Сообщение от siriusED Посмотреть сообщение
А как мне в статическом методе использовать контекст сервиса? Можно пример кода что бы я понимал о чем Вы говорите?
Вы описали проблему с завершением Активити пропадает и контекст Активити.
Все что можно предложить - это использовать контексто от того, что не пропадает. В Вашем случае присутствует сервис.
Если и он завершается, то ничего не поможет. Не будет контекста. Никакого.

Использовать контекст Сервиса ровно так же, как и контекст Активити.

Я никакого примера использования не могу предоставить. Потому что не вижу исходного кода Вашей программы(по представленным обрезкам мало чего можно понять).

До сихпор не знаю. Сервис сразу завершается после запуска? Или он постоянно работает?

Добавлено через 3 минуты
И если нельзя в статическом методе использовать контекст, может стоит подумать о том, что бы не далать его статическим?
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
13.06.2022, 23:39  [ТС]
Цитата Сообщение от vs2019 Посмотреть сообщение
До сихпор не знаю. Сервис сразу завершается после запуска? Или он постоянно работает?
Процесс сервиса работает, процесс основной пишет "DEAD" в LogCat Android Studio. Так что на сколько я понимаю сервис работает, но он походу зависает или что.

Цитата Сообщение от vs2019 Посмотреть сообщение
И если нельзя в статическом методе использовать контекст, может стоит подумать о том, что бы не далать его статическим?
Вопрос в том почему контекст пропадает во обще, я же его храню как статик полсе в классе сервиса, сборщик мусора не должен убивать ссылку на контекст это какой-то бред... Вот в чем вопрос, по логике все должно работаеть и контекст должен хранится неопределенное количество времени в классе сервиса и все должно быть ок, но почему-то получается две проблемы:
1. Умирает основной процесс
2. сохраненный контекст в статическом поле класса сервиса через какое-то время стает null. я такого ни разу еще не встречал ни в одном языке программирования, если честно...

Цитата Сообщение от vs2019 Посмотреть сообщение
Потому что не вижу исходного кода Вашей программы(по представленным обрезкам мало чего можно понять).
Так весь нужный код вот же:
Java
1
2
3
4
5
6
7
8
9
    public static void starService(String actionMessage) {
        Intent serviceIntent = new Intent(context, MyForegroundService.class);
        serviceIntent.putExtra("action", actionMessage);
        ContextCompat.startForegroundService(context, serviceIntent);
 
        if (isTimerOn && !isTimerStarted) {
            startTimer();
        }
    }
new Intent(context и ContextCompat.startForegroundService(con text Вот тут мне нужен контекст, вот тут ошибка и вся проблема, в этом месте контекст == null, через какое-то время. Вот здесь статический метод внутри класса сервиса "MyForegroundService" как мне в этом месте использовать НЕ статический контекст самого сервиса?
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
14.06.2022, 07:06
Что Вы называете "основной процесс"?
Что-то у Вас не так. Понять, что не так, по Вашему описанию не представляется возможным.

Вообще, ссылку на Активити ниоткуда давать не надо.
Если туториалы читали, то сейчас рекомендуемой является MVVM (Model View ViewModel) Architecture Pattern.
В которой все вьюшки берут данные из вьюмодели.
И никакой логики в Активити быть не должно.
И никаких ссылок ни откуда на Активити.

Не надо контекст из активити в сервисе использовать.
И наоборот. У каждого свой контекст.
Где нужен контекст - он там есть. Такова архитектура.
Статичесие методы и свойства создавать тоже не надо.

Я попробовал из сервиса сделать ссылку на Активити. У меня ничего не пропадает. Ссылка остается рабочей. Даже если остановить Активити командой finish(). И методы в сервисе по ссылке на закрытую активити работают, даже если Активити finish()-ed.
Хотя так делать не надо. И не за чем.
Есть же жизненные циклы у Активити. И у сервиса.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
14.06.2022, 14:40  [ТС]
Ну у меня просто запущен таймер который каждые 2 секунды обновляет нотификейшен через старт сервиса, с новым интентом в котором новый "serviceIntent.putExtra("action", actionMessage);", то есть новое сообщение, и через некоторое время нотификейшен перестает обновляться, на нотификейшене так же есть две кнопки с функционалом, и когда я их нажимаю то там тоже ошибки что типа нету контекста, в упор не понимаю где проблема, все должно работать без проблем... Такое ощущение что либо система либо что-то еще влияет на работу моего сервиса или я хз что это такое...

Я бы и рад использовать контекст самого сервиса в моих методах запуска и остановки сервиса но проблема в том что когда я запускаю сервис то я не создаю объект а он создается сам, я передаю только объект класса при запуске, и я у меня нету созданного объекта, вот как здесь:
Java
1
2
3
Intent serviceIntent = new Intent(context, MyForegroundService.class);
serviceIntent.putExtra("action", actionMessage);
ContextCompat.startForegroundService(context, serviceIntent);
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
14.06.2022, 15:30
Покажите исходный текст.
Никаких статических методов не нужно.
Никаких ссылок на контекст Активити не нужно.

Все прекрасно работает.
Из таймера прекрасно обновляется все в Notification.
Причем даже когда сервис остановлен, если таймер в onDestroy методе сервиса не остановить.

Цитата Сообщение от siriusED Посмотреть сообщение
проблема в том что когда я запускаю сервис то я не создаю объект а он создается сам
Не вижу в этом никакой проблемы. Запускается сервис - создается контекст. Все прекрасно работает.

Цитата Сообщение от siriusED Посмотреть сообщение
я передаю только объект класса при запуске
И Вы думаете, кто-то знает, что за объект, какого класса и куда Вы передаете при запуске? И зачем?

Просто покажите исходники, если хотите, что бы кто-то нашел в чем косяки заключаются.

Добавлено через 3 минуты
Цитата Сообщение от siriusED Посмотреть сообщение
через некоторое время нотификейшен перестает обновляться
Через какое время? Как Вы определяете, что обновляться notification перестает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2022, 15:30
Помогаю со студенческими работами здесь

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

Закрытия первого окна формы без закрытия всей программы
Прошу помочь: в программе два окна, в начале открывается первое, после нажатия кнопки открывается второе окно (Form2.Show), при загрузки...

Service автозапуск после закрытия родителя
Такой вопрос назрел несущей. Есть актвити и сервис. и подружить бы мне б их хотелось. но есть проблема везкая. дружбу дружбою...

Как осуществить вывод таблицы в DataGrid и обновление таблицы в БД после закрытия окна программы
Имеется БД в MS Sql с одной таблицей. Как осуществить вывод таблицы в DataGrid(или другой компонент) и обновление таблицы в БД после...

Как убрать ICQ из пуска? после закрытия окна программы, ICQ остается в пуске
Как сделать предосмотр на картинках включеный а на папках выключеный? Как убрать ICQ из пуска? после закрытия окна программы, ICQ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru