Остановить несвязанную службу в Android

У меня есть служба, которая автоматически обновляет базу данных через заданный интервал времени. Для этого он получает информацию из Интернета.

Мне нужно, чтобы он был несвязанным, чтобы он работал над всеми действиями. Но когда приложение закрыто, было бы неплохо завершить службу. Для предотвращения разряда батареи. Как этого добиться?


person johan    schedule 27.09.2011    source источник


Ответы (3)


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

public class DbUpdateService extends Service {
  //compat to support older devices
  @Override
  public void onStart(Intent intent, int startId) {
      onStartCommand(intent, 0, startId);
  }


  @Override
  public int onStartCommand (Intent intent, int flags, int startId){
   //your method to update the database
   UpdateTheDatabaseOnceNow();

   //reschedule me to check again tomorrow
    Intent serviceIntent = new Intent(DbUpdateService.this,DbUpdateService.class);
    PendingIntent restartServiceIntent = PendingIntent.getService(DbUpdateService.this, 0, serviceIntent,0);
    AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE);
    // cancel previous alarm
    alarms.cancel(restartServiceIntent);
    // schedule alarm for today + 1 day
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 1);

    // schedule the alarm
    alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent);
    return Service.START_STICKY;
  }

}

Чтобы запустить службу во время загрузки, используйте это:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class serviceAutoLauncher  extends BroadcastReceiver{

@Override
  public void onReceive(Context context, Intent intent) {
      Intent serviceIntent = new Intent(context,DbUpdateService.class);
      context.startService(serviceIntent);
  }

}

Наконец, добавьте это в свой манифест, чтобы запланировать запуск вашего serviceAutoLauncher при каждой загрузке:

    <receiver android:name="serviceAutoLauncher">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            <category android:name="android.intent.category.HOME"></category>
        </intent-filter>
    </receiver>
person Laurent'    schedule 27.09.2011

Используйте метод stopService.

person Ovidiu Latcu    schedule 27.09.2011

Это зависит от того, как вы запускаете службу. Если вы запускаете его, когда ваша активность открыта, вызовите stopService в своей деятельности onDestroy().

person Justin Breitfeller    schedule 27.09.2011