Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
416 / 307 / 113
Регистрация: 28.08.2013
Сообщений: 832

Как сделать чтоб фоновый сервис работал постоянно?

31.10.2024, 14:40. Показов 985. Ответов 9

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Ситуация такая. Программа запускает фоновый сервис (FOREGROUND_SERVICE), всё работает хорошо, так как нужно. Но работает пока экран включен и/или телефон на зарядке. Если у телефона экран выключен или телефон не на зарядке, то андройд фоновый процесс останавливает. Вернее, фоновый процесс запускается с периодичность раз в 5 - 30 секунд. Всё остальное время фоновый процесс не работает.
Как это можно исправить, чтоб фоновый процесс работал постоянно. В фоновом процессе нет больших вычислений. Он только проверяет наступило ли время для запроса на сервер.
Может быть нужно что-то в коде прописать или запросить какие-то разрешения?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2024, 14:40
Ответы с готовыми решениями:

Как встроить 3-й сервис пак в установку Windows XP чтоб работал серийник от SP1 ?
Попробовал, все прошло удачно, но при последующей установке, серийник который подходил к оригинальному диску установки уже не...

Незнаю как сделать чтоб код сам работал
Незнаю как сделать чтоб код сам работал а не по нажатию кнопки, есть ли какието средства?

Как сделать этот код без указателя, чтоб работал
Данные о росте 25 учеников класса, упорядоченные по убыванию, записаны в массиве. В начале учебного года в класс поступили два новых...

9
400 / 343 / 85
Регистрация: 17.10.2014
Сообщений: 1,015
31.10.2024, 17:09
Цитата Сообщение от kidASM Посмотреть сообщение
Как это можно исправить, чтоб фоновый процесс работал постоянно.
увы, но просто так сделать "неубиваемую" службу не получится, т.к. это негативно повлияет на автономность устройства.

Цитата Сообщение от kidASM Посмотреть сообщение
Он только проверяет наступило ли время для запроса на сервер.
вот введенные платформой ограничения, как раз и борются в том числе и с таким поведение.

Цитата Сообщение от kidASM Посмотреть сообщение
Может быть нужно что-то в коде прописать или запросить какие-то разрешения?
посмотрите в сторону AlarmManager, JobScheduler, WorkManager.
но в любом случае решение нельзя будет назвать "неубиваемым".

как вариант, если концепция приложения позволяет, инициатором запроса делать не клиент, а сервер.
сервер шлет пуш на клиент, а клиенту уже делает запрос на сервер.
2
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
31.10.2024, 21:49
Цитата Сообщение от kidASM Посмотреть сообщение
Может быть нужно что-то в коде прописать или запросить какие-то разрешения?
Нужно.
Во-первых, в onStartCommand вернуть START_STICKY
во-вторых, в onCreate повесить нотификацию.
0
416 / 307 / 113
Регистрация: 28.08.2013
Сообщений: 832
01.11.2024, 10:32  [ТС]
Есть и START_STICKY, и нотификация.
0
416 / 307 / 113
Регистрация: 28.08.2013
Сообщений: 832
08.11.2024, 12:15  [ТС]
androbro, Сделал через WorkManager, но сервис падает через 1467 секунд показывая такой лог.
Code
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
Background concurrent copying GC freed 5722KB AllocSpace bytes, 0(0B) LOS objects, 52% free, 5636KB/11MB, paused 2.195ms,913us total 132.913ms
 
Background concurrent copying GC freed 6629KB AllocSpace bytes, 0(0B) LOS objects, 49% free, 7647KB/14MB, paused 1.411ms,1.641ms total 154.123ms
 
Background young concurrent copying GC freed 7521KB AllocSpace bytes, 0(0B) LOS objects, 45% free, 8959KB/16MB, paused 11.394ms,3.913ms total 119.731ms
 
Background young concurrent copying GC freed 8636KB AllocSpace bytes, 0(0B) LOS objects, 47% free, 9538KB/17MB, paused 15.419ms,5.360ms total 159.548ms
 
Background young concurrent copying GC freed 9218KB AllocSpace bytes, 0(0B) LOS objects, 47% free, 10158KB/19MB, paused 4.130ms,3.997ms total 104.552ms
 
Background concurrent copying GC freed 9046KB AllocSpace bytes, 0(0B) LOS objects, 49% free, 10MB/20MB, paused 2.185ms,4.239ms total 155.009ms
 
Background concurrent copying GC freed 9652KB AllocSpace bytes, 0(0B) LOS objects, 49% free, 10MB/21MB, paused 2.221ms,4.837ms total 164.254ms
 
 
Background young concurrent copying GC freed 10MB AllocSpace bytes, 0(0B) LOS objects, 47% free, 11MB/21MB, paused 5.487ms,5.457ms total 125.301ms
 
Background concurrent copying GC freed 10MB AllocSpace bytes, 0(0B) LOS objects, 49% free, 11MB/23MB, paused 2.453ms,5.622ms total 185.752ms
 
Background young concurrent copying GC freed 11MB AllocSpace bytes, 0(0B) LOS objects, 47% free, 12MB/23MB, paused 20.603ms,5.920ms total 166.532ms
 
 
Background concurrent copying GC freed 10MB AllocSpace bytes, 0(0B) LOS objects, 49% free, 12MB/25MB, paused 2.673ms,5.962ms total 197.407ms
 
pthread_create failed: couldn't mprotect R+W 1081344-byte thread mapping region: Out of memory
Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Try again" (VmSize 143104372 kB)
 
Work [ id=7ee2fcf4-a910-474a-991d-5bbc7de997f5, tags={ com.bbjsoft.MyApp.MyWorker, MyAppWorker } ] failed because it threw an exception/error
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
    at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
    at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
    at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:317)
    at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
    at java.lang.Thread.run(Thread.java:1012)
Caused by: java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
    at java.lang.Thread.nativeCreate(Native Method)
    at java.lang.Thread.start(Thread.java:976)
    at com.android.volley.RequestQueue.start(RequestQueue.java:175)
    at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:109)
    at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:69)
    at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:121)
    at com.bbjsoft.MyApp.web.ping(web.java:341)
    at com.bbjsoft.MyApp.MyWorker.someFoo(MyWorker.java:79)
    at com.bbjsoft.MyApp.MyWorker.doWork(MyWorker.java:67)
    at androidx.work.Worker$1.run(Worker.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) 
    at java.lang.Thread.run(Thread.java:1012) 
Worker result FAILURE for Work [ id=7ee2fcf4-a910-474a-991d-5bbc7de997f5, tags={ com.bbjsoft.MyApp.MyWorker, MyAppWorker } ]
setEnabledSetting : userId = 0 packageName = com.bbjsoft.MyApp cmp = androidx.work.impl.background.systemalarm.RescheduleReceiver newState = 2 callingPackage = com.bbjsoft.MyApp
bg information pid:18956 uid:10734 pkgName:com.bbjsoft.MyApp
Stopping foreground service
pthread_create failed: couldn't mprotect R+W 1032192-byte thread mapping region: Out of memory
(1) Failed to create sync thread. rc: 11, walPath: /data/data/com.bbjsoft.MyApp/no_backup/androidx.work.workdb-wal
onForegroundStateChanged: [dialog:false]:[isForeground:false]:[packageName:com.bbjsoft.MyApp]:[token:android.os.BinderProxy@c349d79]:[userId:0]
pthread_create failed: couldn't mprotect R+W 1032192-byte thread mapping region: Out of memory
(1) Failed to create sync thread. rc: 11, walPath: /data/data/com.bbjsoft.MyApp/no_backup/androidx.work.workdb-wal
hideForNotification : packageName = com.bbjsoft.MyApp
remove : sbn : StatusBarNotification(pkg=com.bbjsoft.MyApp user=UserHandle{0} id=1 tag=null key=0|com.bbjsoft.MyApp|1|null|10734: Notification(channel=workmanager02 shortcut=null contentView=null vibrate=null sound=null defaults=0x0 flags=0x62 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0 semMissedCount=0))
isAcceptableApplication:  pkg=com.bbjsoft.MyApp , range=1 , includeAllApp=false , userId=0 , infoRange=0 , infoCategory=0
identifyGamePackage. com.bbjsoft.MyApp, mCurrentUserId: 0, callerUserId: 0, callingMethodInfo: com.android.server.chimera.ICollectionCache$GameAppsCache.update(ChimeraDataCache.java:178)
getGamePkgData(). com.bbjsoft.MyApp
hideEdgeLightingInternal : packageName = com.bbjsoft.MyApp, reason=1
stopEdgeLightingInternal mHosts is null. pkg=com.bbjsoft.MyApp,reason=1
CancelNotificationRunnable end r = 0|com.bbjsoft.MyApp|1|null|10734, reason = 8
Job didn't exist in JobStore: be4e4a2 #u0a734/0 com.bbjsoft.MyApp/androidx.work.impl.background.systemjob.SystemJobService
removeFromNotificationList record com.bbjsoft.MyApp
Объявлени сервис в AndroidManifest.xml
XML
1
2
3
4
<service
            android:name="androidx.work.impl.foreground.SystemForegroundService"
            android:foregroundServiceType="dataSync"
            tools:node="merge"/>
Запускается через кнопку
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
btnServiceStart.setOnClickListener(view -> {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
        if(ContextCompat.checkSelfPermission(Dashboard.this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(Dashboard.this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, 101);
        }
    }
    WorkManager workManager = WorkManager.getInstance(this);
 
    OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
        .addTag(workTag)
        .build();
    workManager.enqueue(workRequest);
});
И сам worker
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ServiceInfo;
import android.graphics.Color;
import android.os.Build;
import android.util.Log;
 
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.work.ForegroundInfo;
import androidx.work.ListenableWorker;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
 
import com.android.volley.VolleyError;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.util.Arrays;
import java.util.Timer;
 
public class MyWorker extends Worker {
    private static final String CHANNEL_ID = "workmanager02";
    private static final String CHANNEL_NAME = "My Channel";
 
    private Context ctx = getApplicationContext();
 
    private String[] FRIENDS_ACCOUNT = new String[0];
    private int[] FRIENDS_ACT = new int[0];
 
    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams){
        super(context, workerParams);
    }
 
    @NonNull
    @Override
    public Result doWork(){
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
        NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
 
        Notification notification = new NotificationCompat.Builder(ctx, CHANNEL_ID)
                .setContentTitle("My Worker is Running")
                .setContentText("Performing a long-running task ...")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setOngoing(true)
                .build();
 
        setForegroundAsync(new ForegroundInfo(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC));
 
        execWork();
 
        return Result.success();
    }
 
    private void execWork(){
        int counter = 0;
        while(true){
            try {
                Log.d(tag, String.valueOf(++counter));
                web.ping(ctx, new MainActivity.VolleyCallback() {
                    @Override
                    public void onSuccess(JSONObject response) {
 
                    }
 
                    @Override
                    public void onError(VolleyError err) {
 
                    }
                });
                Thread.sleep(1000);
            } catch (InterruptedException err) {
                err.printStackTrace();
            }
        }
    }
 
    private void addNotification(String title, String text){
        NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID);
        builder.setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(text)
                .setAutoCancel(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        Intent intent = new Intent(ctx, Dashboard.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_MUTABLE);
        builder.setContentIntent(pendingIntent);
        NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            NotificationChannel notificationChannel = notificationManager.getNotificationChannel(CHANNEL_ID);
            if(notificationChannel == null){
                int importance = NotificationManager.IMPORTANCE_HIGH;
                notificationChannel = new NotificationChannel(CHANNEL_ID, "MyApp service", importance);
                notificationChannel.setLightColor(Color.GREEN);
                notificationChannel.enableVibration(true);
                notificationManager.createNotificationChannel(notificationChannel);
            }
        }
        notificationManager.notify(0, builder.build());
    }
}
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
08.11.2024, 12:20
Что-то вы явно не то делаете в сервисе, вас по OOM прибивают. Скормнее в запросах надо быть. Возможно стоит пересмотреть алгоритм работы с данными?
0
400 / 343 / 85
Регистрация: 17.10.2014
Сообщений: 1,015
08.11.2024, 15:02
kidASM, что то вы намудрили, вы делаете одноразовый OneTimeWorkRequest, и хотите что бы Worker жил вечно посредством while(true), но это в корне не правильно.
Worker должен вызваться, сделать свою работу и завершиться.
Вам больше по смыслу подходит PeriodicWorkRequest, но там минимальный интервал запуска 15 минут, а у вас он как понимаю - 1секунда, судя по Thread.sleep(1000);
С такими частыми вызовами вы очень быстро высадите батарею.
0
416 / 307 / 113
Регистрация: 28.08.2013
Сообщений: 832
08.11.2024, 15:17  [ТС]
Это сделано чтоб узнать время работы сервиса/воркера. Потом запросы будет идти другие и немного реже.

Добавлено через 1 минуту
По батарее, пока статистика показывает 0% использования воркером/сервисом.
Есть решение?
0
400 / 343 / 85
Регистрация: 17.10.2014
Сообщений: 1,015
08.11.2024, 15:50
Цитата Сообщение от kidASM Посмотреть сообщение
По батарее, пока статистика показывает 0% использования воркером/сервисом.
это с походами в сеть каждую секунду?
0
416 / 307 / 113
Регистрация: 28.08.2013
Сообщений: 832
08.11.2024, 15:59  [ТС]
Да. Для железа, в +/- современных устройствах, одна секунда простоя приложения, это оооочень долго.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2024, 15:59
Помогаю со студенческими работами здесь

Как сделать, чтоб <a href работал с текстовым полем AR_Numb ?
Помогите пожалство: ... &lt;table border&gt; &lt;!-- Header --&gt; &lt;tr bgcolor=#CCCCCC&gt; &lt;td&gt; &lt;b&gt;AR_Number&lt;/b&gt; &lt;/td&gt; ...

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

как сделать похожий background gradient чтоб работал под ie8 и opera?
Помогите пожалуйста сделать похожий градиент, нужна работа во всех основных браузерах, включая ie8 и opera, пока у меня либо там либо там...

Как сделать чтоб сессия постоянно висела?
Здравствуйте друзья. Меня попросил пользователь моего сайта (локального), чтоб Я сделал постоянно висящую сессию т.е. ему надоело :)...

Как сделать чтоб при переходе на любой адрес на сайте всегда работал один php скрипт?
Честно говоря, не знаю как правильно сформулировать вопрос, просто понадеюсь на то, что меня кто-то поймёт Вопрос собственно состоит в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru