2016-09-26 2 views
0

У меня есть услуга, которая каждые 10 секунд каждую неделю подписывается на нее. Это мое определение обслуживания:Служба onStop не останавливает службу.

public class MyService extends Service { 

private final static String TAG = "AccountSummaryService"; 
public static final String BROADCAST_ACTION = "com.mypackage.mobile"; 
private Handler handler = new Handler(); 
private final int delayedStartupTime = 1000; 
private Intent intent; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    intent = new Intent(BROADCAST_ACTION); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    handler.postDelayed(broadcast, 1000); 
    return START_STICKY; 
} 

private Runnable broadcast = new Runnable() { 
    @Override 
    public void run() { 
     sendBroadcast(intent); 
     handler.postDelayed(this, 10000); 
    } 
}; 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    this.stopSelf(); 
    handler.removeCallbacksAndMessages(broadcast); 
} 

В моей деятельности я зарегистрировать/запуска и отмены/остановки servince в моих onResume/OnPause методами. Они называются так что следующий код фактически запускается на выполнение:

//in the onCreate 
Intent anIntent = new Intent(activity, MyService.class); 

@Override 
public void onResume() { 
    super.onResume(); 
    startSummaryRefreshService(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    stopSummaryRefreshService(); 
} 

private void startSummaryRefreshService() { 
    activity.startService(anIntent); 
    activity.registerReceiver(myReceiverObject, new IntentFilter(RefreshUIService.BROADCAST_ACTION)); 
} 

public void stopSummaryRefreshService() { 
    activity.unregisterReceiver(myReceiverObject); 
    activity.stopService(anIntent); 
} 

Проблема заключается в том, что даже если StopService() вызывается служба до сих пор работает, и когда я повторно зарегистрировать приемник он будет вызываться несколько раз.

В принципе ... Я не могу остановить службу в любом случае. Я пытался много решений StackOverflow, но ... нет.

В чем я ошибаюсь?

+0

Что вы имеете в виду, когда вы «перерегистрируете мой ресивер»? Как вы это делаете? Вы снова показываете одно и то же действие? Также почему вы вызываете методы start/stop с «активностью»? Какова эта ссылка на действия? вызывая это из-за пределов кода операции? –

+0

Хороший вопрос: на самом деле он не возобновляет свою деятельность, а фрагмент. – user2274307

+0

Уточните или напишите больше кода –

ответ

0

Спасибо за ответы. Проблема заключалась в таймере. onDestroy() был правильно назван, но способ, которым я определил цикл, создал бесконечный цикл, потому что runnable - это сам объект, отделенный от службы (который фактически убит с помощью onDestroy()), и его воссоздают каждые 10 секунд после запуска.

-1

Является ли ваше обязательство закрытым?

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

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

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

1) Вы до сих пор связаны клиенты (например, другие виды деятельности), в этом случае вы не можете остановить службу, пока они не отвязать

2) Так как unbindService() и stopService() являются асинхронными, что-то может сработать с учетом времени, и в этом случае вам может повезти, если вы вызове stopService() из метода onServiceDisconnected() службы ServiceConnection.

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

+0

onBind возвращает null, поэтому нет привязки. –

+0

почему downvote? Я объяснил концепцию привязки сервисов. –

+0

Так же была документация. Ваш ответ не связан с проблемой. Служба OP возвращает 'null' в методе' onBind', что означает, что служба не может быть связана. Если вы собираетесь сказать «это может помочь кому-то еще», это не первый раз связанные службы обсуждаются. Пожалуйста, держите сайт чистым. Спасибо. –

0

Ваша проблема здесь:

public void onDestroy() { 
    super.onDestroy(); 
    this.stopSelf(); 
    handler.removeCallbacksAndMessages(broadcast); 
} 

Прежде всего, вам не нужно вызывать this.stopSelf() изнутри onDestroy() потому onDestroy() вызывается, когда Service уже был остановлен.

Во-вторых, звонок в removeCallbacksAndMessages(broadcast) не удаляет Runnable, который вы отправили на адрес Handler. Вот почему, даже после того, как вы остановили Service, вы все равно получаете трансляцию Intent каждые 10 секунд. Аргумент removeCallbacksAndMessages() - это не Runnable, а «токен» (который вы не используете).

Чтобы решить эту проблему, просто позвоните removeCallbacks(broadcast). Этот метод принимает Runnable в качестве аргумента и удаляет опубликованный Runnable с Handler (это то, что вы хотите сделать).

 Смежные вопросы

  • Нет связанных вопросов^_^