Уничтожение службы

Я читал про сервисы в Android и специально дошел до этого

Пока приложение находится на переднем плане, оно может свободно создавать и запускать как активные, так и фоновые службы. Когда приложение переходит в фоновый режим, у него есть окно в несколько минут, в течение которого ему все еще разрешено создавать и использовать службы. В конце этого окна приложение считается бездействующим. В это время система останавливает фоновые службы приложения, как если бы приложение вызывало методы службы Service.stopSelf().

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

  1. Так какой смысл убивать службу? Процесс/поток все еще выполняется.
  2. Зачем вообще убивать службу? Что, если я хочу выполнить процесс загрузки и НЕ хочу быть процессом переднего плана?

    public class HelloService extends Service {
    private Looper mServiceLooper;
    private ServiceHandler mServiceHandler;
    
    // Handler that receives messages from the thread
    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            // Normally we would do some work here, like download a file.
            // For our sample, we just sleep for 5 seconds.
            Log.d("sssssssss",msg.toString()+"sssssssssss");
            while(true){
    
                Log.d("sssssssss","sssssssssss");
    
            }
            // Stop the service using the startId, so that we don't stop
            // the service in the middle of handling another job
            //stopSelf(msg.arg1);
        }
    }
    
    @Override
    public void onCreate() {
        // Start up the thread running the service. Note that we create a
        // separate thread because the service normally runs in the process's
        // main thread, which we don't want to block. We also make it
        // background priority so CPU-intensive work doesn't disrupt our UI.
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
                Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
    
        // Get the HandlerThread's Looper and use it for our Handler
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    
        // For each start request, send a message to start a job and deliver the
        // start ID so we know which request we're stopping when we finish the job
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        mServiceHandler.sendMessage(msg);
    
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }
    
    @Override
    public void onDestroy() {
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    }
    
    
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    }
    

person Nick    schedule 25.11.2018    source источник
comment
Вы упомянули процесс загрузки. Если вы используете службу, которая порождает поток для выполнения загрузки, рассмотрите вместо этого использование DownloadManager.   -  person Greg Moens    schedule 26.11.2018


Ответы (1)


  1. Система позволяет вам завершить чистку Service, запустив его метод уничтожения. Ваш поток не будет работать вечно, я думаю, что 30 минут - это жесткий предел, прежде чем процесс приложения будет убит.
  2. Это новая политика, начиная с Android O, направленная на сохранение времени автономной работы и повышение производительности. Многие разработчики выполняли тяжелые операции в фоновом режиме (непрерывное открытие розеток, периодические показания датчиков и т. д.), и без уведомлений на переднем плане пользователи не знали, почему их устройства были вялыми и плохо работали от батареи.

Подробнее читайте в документе Ограничения фонового выполнения.

person Pawel    schedule 25.11.2018
comment
Я думаю, что 30 минут - это жесткий предел, прежде чем процесс приложения будет убит. Почему процесс приложения убит? Приложение закрывается в фоновом режиме, если на устройстве недостаточно ресурсов. - person Nick; 26.11.2018
comment
Правильно, то же самое, если вы создаете поток из действия. Вам лучше убедиться, что вы очистили этот поток во время надлежащих методов жизненного цикла. То, что вы можете оставить поток работающим, не означает, что вы должны это делать. - person Greg Moens; 26.11.2018
comment
@Ник, это все еще зависит от реализации OEM, некоторые (особенно китайские) ПЗУ гораздо более агрессивны, когда дело доходит до уничтожения процесса, чем другие. - person Pawel; 26.11.2018