code: @CallSuper
      protected void onHandleIntent(Intent intent) {
          if (intent == null) {
              return;
          }
  
          String action = intent.getAction();
          // TODO: permissions?
          if (ACTION_SUBSCRIBE.equals(action)) {
              processSubscribe(
                      (ComponentName) intent.getParcelableExtra(EXTRA_SUBSCRIBER_COMPONENT),
                      intent.getStringExtra(EXTRA_TOKEN));
  
          } else if (ACTION_HANDLE_COMMAND.equals(action)) {
              int commandId = intent.getIntExtra(EXTRA_COMMAND_ID, 0);
              processHandleCommand(commandId, intent.getExtras());
  
          } else if (ACTION_NETWORK_AVAILABLE.equals(action)) {
              processNetworkAvailable();
          }
      }
docs: This method is invoked on the worker thread with a request to process.
  Only one Intent is processed at a time, but the processing happens on a
  worker thread that runs independently from other application logic.
  So, if this code takes a long time, it will hold up other requests to
  the same IntentService, but it will not hold up anything else.
  When all requests have been handled, the IntentService stops itself,
  so you should not call {@link #stopSelf}.
  
  @param intent The value passed to {@link
  android.content.Context#startService(Intent)}.
  This may be null if the service is being restarted after
  its process has gone away; see
  {@link android.app.Service#onStartCommand}
  for details.
  
  @see IntentService#onHandleIntent(Intent)