2014-12-13 4 views
2

Я использую следующий код, чтобы остановить мое обслуживаниеОстановка службы в деятельности

Intent intent = new Intent(MainActivity.this, UsageRecorderService.class); 
stopService(intent); 

И это моя служба, которая работает на неопределенный срок

public class UsageRecorderService extends IntentService { 

    public UsageRecorderService() { 
     super("UsageRecorder"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     while (true) { 

      UsageRecorder.recordUsages(this, false); 

      SystemClock.sleep(10000); 
     } 
    } 
} 

Почему не остановить мою службу?

+1

Ответ: http://stackoverflow.com/questions/8709989/how-to-stop-intentservice-in-android – eleven

ответ

2

Этот код будет работать

public class UsageRecorderService extends IntentService { 

    private boolean mStop = false; 

    public UsageRecorderService() { 
     super("UsageRecorder"); 
    } 

    public final Object sLock = new Object(); 

    public void onDestroy() { 
     synchronized (sLock) { 
      mStop = true; 
     } 
    } 


    @Override 
    protected void onHandleIntent(Intent intent) { 
     while (true) { 
      synchronized (sLock) { 
       if (mStop) break; 
      } 
      UsageRecorder.recordUsages(this, false); 
      SystemClock.sleep(10000); 
     } 
    } 

} 

Вы можете использовать stopService

Intent intent = new Intent(MainActivity.this, UsageRecorderService.class); 
stopService(intent); 

Также я рекомендую прочитать Services guide, чтобы понять, что там происходит.

+0

Можете ли вы объяснить синхронизацию и sLock –

+1

. @MousaJafari оба предназначены для [Синхронизация] (https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html) чтения/записи Поле 'mStop' на разных потоках – gio

+0

Это хорошее решение. Подробнее – Jerome

0

активность:

sendBroadcast(new Intent(ACTION_STOP)); 

IntentService

public class UsageRecorderService extends IntentService { 
    private static final String TAG = "UsageRecorderService"; 
    String ACTION_STOP = "com.xxx.UsageRecorderService.ACTION_STOP"; 
    boolean stop; 

    public UsageRecorderService() { 
    super("UsageRecorder"); 
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
     if (ACTION_STOP.equals(intent.getAction())) { 
     stop = true; 
     } 
    } 
    }; 

    @Override public void onCreate() { 
    super.onCreate(); 
    IntentFilter intentFilter = new IntentFilter(ACTION_STOP); 
    registerReceiver(receiver, intentFilter); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    Log.i(TAG,"onHandleIntent"); 
    while (true && !stop) { 
     Log.i(TAG,"----running----"); 
     //UsageRecorder.recordUsages(this, false); 
     SystemClock.sleep(10000); 
    } 
    } 

    @Override public void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(receiver); 
    } 
} 
+0

К сожалению, этот код не работает – gio

+0

http://stackoverflow.com/questions/10250745/ Правильный путь к остановке-intentservice/10250896 # 10250896 – Jerome

+0

Я протестировал его и не работал. Может быть, проблема в моем цикле while? –

0

IntentService предназначен для остановки только тогда, когда все запросы, присутствующие в рабочей очереди, были обработаны. Андроид останавливает службу после того, как все начальные запросы были обработаны.

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