title: Why foreground service stops when screen is off on Android Oreo?
body: <p>Android Oreo stops my foreground service when I turn off screen. It happens, when device is unpluged. I test my app on Huawei MediaPad T5. I send test request every 30 seconds with Handler.postDelayed.  </p>
  
  <p>I read about background executions limits in Android 8. In migration guide, is written, that foreground service should work. I can't use JobScheduler, JobIntenService or WorkManager, because they can repeat only every 15 minutes. </p>
  
  <p>I can't use Firebase Cloud Messaging, because my app does part of work offline.</p>
  
  <p>I use also bound service, because it should not have background restrictions. Unfortunately, my app still not works correct.</p>
  
  <p>I tried to use WakeLock, give service to another process, AlarmManager, add my app to Whitelist and it still not work.</p>
  
  <p>I test running in background by simple post reqest. I connect to test server by Retrofit Library.</p>
  
  <p>MainActivity </p>
  
  <pre class="lang-java prettyprint-override"><code>private LocalService mService;
  private boolean mBound = false;
  private Intent mIntent;
  
  private ServiceConnection connection = new ServiceConnection() {
  
      @Override
      public void onServiceConnected(ComponentName className, IBinder service) {
          LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
          mService = binder.getService();
          mBound = true;
      }
  
      @Override
      public void onServiceDisconnected(ComponentName arg0) {
          mBound = false;
          mService = null;
      }
  
  };
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      mIntent = new Intent(this, LocalService.class);
      if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.O) {
          ContextCompat.startForegroundService(getApplicationContext(), mIntent);
      }
      PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
      cpuLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "kb:wl");
  }
  
  @Override
  protected void onStart() {
      super.onStart();
      Intent intent = new Intent(this, LocalService.class);
      bindService(intent, connection, Context.BIND_AUTO_CREATE);
  }
  
  @Override
  protected void onStop() {
      super.onStop();
      cpuLock.acquire();
  }
  
  
  public void onButtonClick(View v) {
      if (mBound) {
          bindService(mIntent, connection, BIND_AUTO_CREATE);
          mService.send();
      }
  }
  
  @Override
  protected void onRestart() {
      super.onRestart();
      cpuLock.release();
  }
  </code></pre>
  
  <p>LocalService class</p>
  
  <pre class="lang-java prettyprint-override"><code>public class LocalService extends Service {
  
      private IBinder mBinder = new LocalBinder();
  
      Handler mHandler;
      String DEBUG_TAG = "local";
  
      public class LocalBinder extends Binder {
          LocalService getService() {
              return LocalService.this;
          }
      }
  
      public int onStartCommand(Intent intent, int flags, int startId) {
          return START_STICKY;
      }
  
      @Override
      public void onCreate() {
          if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.O) {
              NotificationManager notificationManager =
                      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  
              String channelId = "some_channel_id";
              CharSequence channelName = "Channel La Manche";
              int importance = NotificationManager.IMPORTANCE_HIGH;
              NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
              notificationManager.createNotificationChannel(notificationChannel);
  
              Intent notificationIntent = new Intent(this, MainActivity.class);
              PendingIntent pendingIntent =
                      PendingIntent.getActivity(this, 0, notificationIntent, 0);
  
              Notification notification =
                      new Notification.Builder(this, channelId)
                              .setContentTitle("post title")
                              .setContentText("post text")
                              .setSmallIcon(R.drawable.ic_launcher_foreground)
                              .setContentIntent(pendingIntent)
                              .setTicker("post ticker")
                              .setOngoing(true)
                              .build();
  
              startForeground(1, notification);
          }
      }
  
      @Nullable
      @Override
      public IBinder onBind(Intent intent) {
          mHandler = new Handler();
          return mBinder;
      }
  
      public void send() {
          mHandler.postDelayed(test, 1000);
      }
  
      private Runnable test = new Runnable() {
  
          public void run() {
              Retrofit retrofit = new Retrofit.Builder()
                      .addConverterFactory(ScalarsConverterFactory.create())
                      .baseUrl("https://test.server.url/")
                      .build();
              Post servicePost = retrofit.create(Post.class);
              Call&lt;String&gt; request = servicePost.send("");
              request.enqueue(new Callback&lt;String&gt;() {
  
                  @Override
                  public void onResponse(@NonNull Call&lt;String&gt; call, @NonNull Response&lt;String&gt; response) {
                      Log.i(DEBUG_TAG, "Code " + response.code());
                  }
  
                  @Override
                  public void onFailure(@NonNull Call&lt;String&gt; call, @NonNull Throwable t) {
                      Log.i(DEBUG_TAG, "Not connected to server. " + t.getMessage());
                  }
  
              });
  
              mHandler.postDelayed(test, 30 * 1000);
          }
  
      };
  </code></pre>
  
  <p>Post interface </p>
  
  <pre class="lang-java prettyprint-override"><code>@Headers("Content-Type: application/json" )
  @POST("api/test")
  Call&lt;String&gt; send(@Body String empty);
  </code></pre>
  
  <p>App works perfect, when tablet is charging or not charging and screen is on. Endomondo works correct even if screen is off. What do I wrong?</p>