Я бы не сказал, что есть лучший способ. Это зависит от варианта использования работы в вашем приложении. Для обоих требуется разрешение использования RECEIVE_BOOT_COMPLETED.
Если пользователь может включить или выключить периодическое задание (задание) или если задание с данными в ограничениях ожидает, и оно должно сохраняться при перезагрузке, вероятно, имеет смысл использовать функцию setPersisted (true). Таким образом, вам не нужно беспокоиться о каких-либо действиях, и задание будет автоматически загружаться с диска при загрузке. Насколько я понимаю, задание также следует планировать с того места, на котором оно было остановлено до перезагрузки, чтобы обеспечить более равномерное планирование задания.
В противном случае, если вы не хотите, чтобы это задание было запланировано до получения намерения BOOT_COMPLETED (может быть много причин для этого), то после получения этого намерения может быть подходящее место для планирования задания. Вы также можете перепланировать не только получение намерения BOOT_COMPLETED, но и другие намерения, такие как MY_PACKAGED_REPLACED. Все эти намерения могут быть получены, и задания запланированы в одном BroadcastReceiver.
Скорее всего, есть другие причины для того или иного пути.