Сервис не остановится, когда stopService метод назовут

У меня в настоящее время есть Сервис, который хорошо работает, когда я запускаю его, но когда я пытаюсь остановить его с помощью stopService метода, его onDestroy метод не становится названным.

Вот код, который я использую, чтобы попытаться остановить Сервис

stop_Scan_Button = (Кнопка) findViewById (R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        Log.d("DEBUGSERVICE", "Stop Button pressed");
        Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
        releaseBind();
        Log.d("Stop_Scan_Button", "Service: " + service.toString());
        stopService(service);
        Log.d("Stop_Scan_Button", "Service should stop! ");

        }   
});

Действительно ли я прав в размышлении, что, когда stopService используется, он называет onDestroy метод Обслуживания? Когда я нажимаю, мое сканирование остановки нажимают на кнопку onDestroy() метод в моем Сервисе не называют.

Есть ли что-либо еще, что я пропускаю это, я должен вставить для остановки сервиса?

Править: добавить onServiceConnected() назван, когда stopService выполняется вместо onServiceDisconnected(), почему это произошло бы?

Править: Добавить больше информации расценивает Привязку

Я называю bindService в onCreate () методом, и у меня затем есть releaseBind (), метод развязывает Сервис.

Вот код для того метода:

 public void releaseBind(){
    unbindService(this);
  }

Таким образом, я предполагаю, что развязывание не является моей проблемой?

25
задан Ciro Santilli 新疆改造中心法轮功六四事件 14 February 2016 в 10:24
поделиться

2 ответа

Вы не должны использовать инжектор напрямую. Вместо этого передайте в Provider < FooClass > . Кроме того, необходимо ввести провайдера в местах, где используется FooClass .

private final Provider<FooClass> provider;

@Inject
public ClassWhereFooIsUsed(Provider<FooClass> provider) {
    this.provider = provider;
}

.... somewhere else
FooClass f = provider.get(); // This is lazy
-121--1356920-

хуже, если это

  SELECT id FROM entries 
  WHERE 
     (SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...) 
     BETWEEN entries.max AND entries.min;

Перезаписать этот синтаксис без использования временного места хранения.

-121--2362894-

Я предполагаю, что ваш вызов метода для releaseBind () означает, что вы ранее вызвали bindService () для этой службы и что releaseBind () вызывает unbindService () . Если мое предположение неверно, пожалуйста, проигнорируйте этот ответ.


Служба завершит работу после того, как все вызовы bindService () получили соответствующие вызовы unbindService () . Если связанных клиентов нет, службе также потребуется stopService () тогда и только тогда, когда для службы будет вызван startservice Service () .

Итак, здесь есть несколько возможностей:

  1. У вас все еще есть связанные клиенты (например, другие действия), в этом случае вы не можете остановить службу, пока они не отменят привязку
  2. Поскольку обе unbindService() и stopService () асинхронны, что-то может быть связано со временем, и в этом случае вы можете получить больше удачи, если позвоните stopService() из метода ServiceConnection onServiceDisconnected ()

Также помните, что точное время уничтожения службы зависит от Android и не может быть немедленным. Так, например, если вы полагаетесь на onDestroy () , чтобы служба остановила некоторые выполняемые работы, рассмотрите возможность использования для этого другого триггера (например, действия, вызывающего метод stopPingStuff () через интерфейс связывания услуг).

43
ответ дан 28 November 2019 в 20:33
поделиться

Хуже, если это

  SELECT id FROM entries 
  WHERE 
     (SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...) 
     BETWEEN entries.max AND entries.min;

Перезаписать этот синтаксис без использования временного места хранения.

-121--2362894-

Я предполагаю, что ваш вызов метода для releaseBind () означает, что вы ранее вызвали bindService () для этой службы и что releaseBind () вызывает unbindService () . Если мое предположение неверно, пожалуйста, проигнорируйте этот ответ.


Служба завершит работу после того, как все вызовы bindService () получили соответствующие вызовы unbindService () . Если связанных клиентов нет, службе также потребуется stopService () тогда и только тогда, когда для службы будет вызван startservice Service () .

Итак, здесь есть несколько возможностей:

  1. У вас все еще есть связанные клиенты (например, другие действия), в этом случае вы не можете остановить службу, пока они не отменят привязку
  2. Поскольку обе unbindService() и stopService () асинхронны, что-то может быть связано со временем, и в этом случае вы можете получить больше удачи, если позвоните stopService() из метода ServiceConnection onServiceDisconnected ()

Также имейте в виду, что точное время уничтожения службы зависит от Android и не может быть немедленным. Так, например, если вы полагаетесь на onDestroy () , чтобы служба остановила некоторые выполняемые работы, рассмотрите возможность использования для этого другого триггера (например, действие, вызывающее метод stopPingStuff () через интерфейс связывания услуг).

-121--1480641-

Все ли привязки закрыты?

Служба может использоваться в двух способы. Два режима не полностью раздельно. Можно выполнить привязку к службе , который был запущен с (). Например, фоновая музыка служба может быть запущена путем вызова startService () с объектом Intent определяет музыку для воспроизведения. Только позже, возможно, когда пользователь хочет осуществлять некоторый контроль над игрок или получить информацию о текущая песня, будет деятельностью установить подключение к службе; путем вызова bindService (). В случаях таким образом, stopService () не будет фактически остановить службу до последняя привязка закрыта

.

10
ответ дан 28 November 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: