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;
    }
}
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
Вам нужен Service. Службы в андроиде так называются.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Frogogo Москва
от 100 000 руб.
Asapp Москва
от 150 000 до 200 000 руб.
BTlabs Москва
от 60 000 руб.