content: package com.achep.base.services;
  
  import android.annotation.SuppressLint;
  import android.app.AlarmManager;
  import android.app.PendingIntent;
  import android.content.Context;
  import android.content.Intent;
  
  import com.achep.base.Device;
  
  import timber.log.Timber;
  
  /**
   * @author Artem Chepurnoy
   */
  public abstract class BaseStickyService extends BaseService {
  
      private static final long PENDING_INTENT_RESTART_DELAY = 4000; // 4 sec.
  
      /**
       * @return {@code true} if service is enabled and should be running,
       * {@code false} otherwise.
       */
      public abstract boolean isEnabled();
  
      public abstract int code();
  
      /**
       * {@inheritDoc}
       */
      @Override
      public void onDestroy() {
          super.onDestroy();
          remoteRestartServiceIfNeeded();
      }
  
      /**
       * {@inheritDoc}
       */
      @Override
      public void onTaskRemoved(Intent rootIntent) {
          super.onTaskRemoved(rootIntent);
          remoteRestartServiceIfNeeded();
      }
  
      private void remoteRestartServiceIfNeeded() {
          if (isEnabled()) remoteRestartService();
      }
  
      @SuppressLint("NewApi")
      private void remoteRestartService() {
          Timber.d("Remote restart service.");
          final Intent intent = new Intent(this, getClass());
          final PendingIntent pi = PendingIntent.getService(this, code(), intent,
                  PendingIntent.FLAG_UPDATE_CURRENT);
  
          // Ask alarm manger to restart us.
          AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
          if (Device.hasMarshmallowApi()) {
              alarm.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                      System.currentTimeMillis() + PENDING_INTENT_RESTART_DELAY,
                      pi);
          } else alarm.set(AlarmManager.RTC_WAKEUP,
                  System.currentTimeMillis() + PENDING_INTENT_RESTART_DELAY,
                  pi);
      }
  
  }
  