В Continue On появились новые методы и классы, которые позволяют указать, что функция поддерживается, и передать необходимые данные. Это позволяет правильно возобновить работу пользователя на принимающем устройстве.
Включить поддержку
Поддержку функции "Продолжить на устройстве" (по умолчанию отключена) необходимо реализовать для каждого действия. Чтобы включить эту функцию, вызовите setHandoffEnabled, чтобы обозначить текущее действие как готовое к передаче. После вызова setHandoffEnabled(true, null) передача может произойти в любой момент, поэтому вызывайте этот метод, только когда действие готово к передаче.
Вы можете проверить, включена ли функция "Продолжить на" для действия, с помощью isHandoffEnabled. Если в действии включена передача, в нем также должен быть реализован метод onHandoffActivityDataRequested, чтобы возвращался ненулевой объект HandoffActivityData, поскольку поведение по умолчанию не реализовано.
class MyHandoffActivity : Activity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Do stuff
...
// Enable handoff
setHandoffEnabled(true, null)
}
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Create and return handoff data
}
}
Вы настраиваете объект HandoffActivityData с нужными дополнительными параметрами и резервным URI, чтобы сообщить функции "Продолжить на устройстве", как выполнить передачу на принимающее устройство.
Эти данные нужны системе в двух случаях:
- Действие переходит в фоновый режим, и соответствующие данные должны быть сохранены.
- Действие выполняется на переднем плане, и был запрошен перенос. Вы можете проверить статус запроса на передачу.
Проверить статус
Класс HandoffActivityDataRequestInfo предоставляет информацию о текущем запросе на передачу действия. Чтобы определить, активен ли запрос, используйте isActiveRequest. Если метод возвращает
- true, текущее действие выполняется на переднем плане и пользователь запросил продолжение на другом устройстве. Однако если
- false – действие остановлено и выполняется в фоновом режиме, но пользователь может запросить передачу в будущем.
Если вы хотите, чтобы на отправляющем устройстве показывался интерфейс, сообщающий пользователю о том, что передача произошла или выполняется, вы можете проверить isActiveRequest на наличие активного запроса. Однако не выполняйте этот код синхронно в рамках onHandoffActivityDataRequested. Вместо этого поставьте в очередь код, который будет выполняться асинхронно, чтобы не блокировать и не задерживать передачу.
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Check whether the handoff request is active
if (handoffRequestInfo.isActiveRequest()) {
// Asynchronously show UI to let users know a handoff is in progress
}
// Create and return handoff data
}
Создать данные для передачи
Чтобы при передаче данных с помощью функции "Продолжить на устройстве" не терялась важная информация, добавьте ее в объект HandoffActivityData.
Класс HandoffActivityData представляет данные, связанные с действием. HandoffActivityData сообщает функции "Продолжить на другом устройстве", как обрабатывать и воссоздавать действия на принимающем устройстве. К этим данным относятся:
- Название компонента (обязательно) –
ComponentNameсоответствующего действия, которое нужно запустить на принимающем устройстве, чтобы продолжить работу пользователя после передачи. В большинстве случаев и для точного воспроизведения активности это будет имя компонента для той же активности, создающейHandoffActivityData. - Дополнительные параметры (необязательно). Вы можете указать дополнительные параметры, которые будут включены в запуск
Intentдействия. ЭтоPersistableBundle, который можно использовать для передачи дополнительной информации компоненту. Размер дополнительных файлов не должен превышать 50 КБ.
Чтобы создать объекты HandoffActivityData, используйте класс builder HandoffActivityData.Builder. Создайте новый конструктор, передав ComponentName действия, которое должно получить передачу (например, this.getComponentName для текущего Activity или явный ComponentName(this, TargetActivity::class.java)). Затем используйте метод setExtras, чтобы при необходимости указать дополнительные параметры. Наконец, вызовите build, чтобы создать объект HandoffActivityData.
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Check whether the handoff request is active
if (handoffRequestInfo.isActiveRequest()) {
// Asynchronously show UI to let users know a handoff is in progress
}
val extras: PersistableBundle = PersistableBundle()
// Put relevant and necessary values into extras (e.g. scroll position)
extras.putString("data_id", getDataId())
extras.putInt("scroll_position", getScrollPosition())
// Create and return handoff data
return HandoffActivityData.Builder(getComponentName()) // Designate handoff to the same activity
.setExtras(extras)
.build()
}
Как настроить резервный вариант для сайтов
Если указанное действие не может быть запущено на принимающем устройстве, вы можете дополнительно использовать setFallbackUri, чтобы при необходимости задать резервный URL, который будет открываться на устройстве в браузере по умолчанию.
Чтобы подсказка "Продолжить на устройстве" появлялась на устройствах, где ваше приложение не установлено, передайте экземпляр HandoffActivityParams с setAllowHandoffWithoutPackageInstalled, заданным как true, при вызове setHandoffEnabled:
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
Затем добавьте резервный URL в HandoffActivityData:
val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.setFallbackUri(fallbackWebLink)
.build()
Как реализовать прямые ссылки на сайт
Чтобы реализовать прямую передачу на сайт, передайте HandoffActivityParams с setAllowHandoffWithoutPackageInstalled(true) в setHandoffEnabled и используйте метод HandoffActivityData.createWebHandoff, чтобы сгенерировать HandoffActivityData:
val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)
Как получить и обработать намерение передачи
На принимающем устройстве приложение должно обработать передачу и воссоздать пользовательский опыт с отправляющего устройства. В частности, в объекте activity, который вы указали в объекте HandoffActivityData, возвращенном методом onHandoffActivityDataRequested, вам нужно обработать намерение и получить дополнительные данные, содержащие информацию о том, как правильно воссоздать объект activity.
Если вы указываете передачу тому же действию, вы можете получить интент в методе onCreate действия, чтобы данные можно было получить и соответствующим образом автоматически заполнить для пользователя.
class MyHandoffActivity : Activity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Do stuff
...
// Get the launch intent and retrieve extras
val intent: Intent = getIntent()
if (intent != null && intent.hasExtra("data_id")) {
val dataID: String = intent.getStringExtra("data_id")
// Retrieve the data that corresponds to the data ID
...
// Populate activity UI with relevant data
...
if (intent.hasExtra("scroll_position")) {
val scrollPosition: Int = intent.getIntExtra("scroll_position", 0)
// Move the page to the scroll position
...
}
}
}
}