sentike
@sentike
Программист, разработчик игр, студент

Как запустить службу в фоне на Android?

Здравствуйте, как запустить службу в фоне, что бы после закрытия приложения (когда в списке активных приложений закрыл его) она продолжила работать? Например, как Вконтакте или любом другом мессенджере - приложения нет в списке активных приложений, но уведомления все равно продолжают приходить (лайки, новые сообщения).

Сейчас использую JobScheduler и запускаю с параметром setMinimumLatency (после того как задача выполнилась - вызываю опять создание задачи. На Android O минимальное время для повторения - 15 минут, для тестов использую 30 секунд). Если приложение открыто или висит в фоне, то служба работает. Если приложение закрыть, функция работать перестает. Я пытался выполнять код и в основном и в отдельном потоке, используя new Thread(new Runnable() в onStartJob

Вот пример используемого кода:
package com.example.sentike.myapplication;

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;


public class ExampleJobService extends JobService {
    private static final String TAG = "ExampleJobService";
    private boolean jobCancelled = false;

	public static void StartService(Context InContext, Class<?> InServiceClass, long InIntervalInSeconds)
	{
		Log.debug( String.format("[AbstractNotifyPoolService][StartService][InServiceClass: %s / %d]", InServiceClass.getSimpleName(), InServiceClass.hashCode()));

		try {

			//=====================================================
			long InIntervalInMs =  InIntervalInSeconds * 1000;
			Intent ServiceClassIntent = new Intent(InContext, InServiceClass);

			//=====================================================
			ComponentName ServiceComponentName = new ComponentName(InContext.getPackageName(), InServiceClass.getName());

			//=====================================================
			JobScheduler JobSchedulerService = (JobScheduler)InContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);

			//=====================================================
			JobInfo.Builder JobServiceBuilder = new JobInfo.Builder(InServiceClass.hashCode(), ServiceComponentName)
					.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
					.setMinimumLatency(InIntervalInMs)
					.setOverrideDeadline(TimeUnit.SECONDS.toMillis(5))
					.setRequiresDeviceIdle(false)
					.setRequiresCharging(false)
					.setPersisted(true);

			//=====================================================
			int JobServiceScheduleStatus = JobSchedulerService.schedule(JobServiceBuilder.build());

			if(JobServiceScheduleStatus == JobScheduler.RESULT_SUCCESS)
			{
				Log.debug( String.format("[AbstractNotifyPoolService][StartService][InServiceClass: %s][Successfully JobServiceSchedule]", InServiceClass.getSimpleName()));
			}
			else
			{
				Log.debug( String.format("[AbstractNotifyPoolService][StartService][InServiceClass: %s][Failed JobServiceSchedule]", InServiceClass.getSimpleName()));
			}
		}
		catch (Exception e)
		{
			Log.debug( String.format("[AbstractNotifyPoolService][StartService][InServiceClass: %s][Exception: %s]", InServiceClass.getSimpleName(), e.getMessage()));
		}
	}

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d(TAG, "Job started");
        doBackgroundWork(params);

        return true;
    }

    private void doBackgroundWork(final JobParameters params) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    Log.d(TAG, "run: " + i);
                    if (jobCancelled) {
                        return;
                    }

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                Log.d(TAG, "Job finished");
                jobFinished(params, false);
            }
        }).start();
    }

    @Override
    public void onDestroy()    {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d(TAG, "Job cancelled before completion");
        jobCancelled = true;
        return true;
    }
}
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
Вам нужен Service. Службы в андроиде так называются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Dialog Москва
от 150 000 до 220 000 руб.
от 90 000 до 160 000 руб.
Stream Москва
от 160 000 руб.
20 марта 2019, в 01:07
1000 руб./за проект
20 марта 2019, в 00:27
2000 руб./за проект
19 марта 2019, в 23:14
6000 руб./за проект