Continue On introduit de nouvelles méthodes et classes pour vous permettre d'indiquer la compatibilité avec la fonctionnalité et de fournir les données nécessaires qui sont transmises. Cela vous permet de reprendre correctement l'expérience utilisateur sur l'appareil récepteur.
Activer l'assistance
La compatibilité avec la fonctionnalité "Continuer sur" (désactivée par défaut) doit être implémentée pour chaque activité. Pour activer la fonctionnalité, appelez setHandoffEnabled pour indiquer que l'activité en cours est prête pour le transfert. Une fois que setHandoffEnabled(true, null) est appelé, le transfert peut se produire à tout moment pour l'activité. Ne l'appelez donc que lorsque l'activité est prête à être transférée.
Vous pouvez vérifier si l'activité a activé l'option "Continuer sur" avec isHandoffEnabled. Si une activité a activé le transfert, elle doit également implémenter onHandoffActivityDataRequested pour s'assurer qu'elle renvoie un HandoffActivityData non nul, car aucun comportement par défaut n'est implémenté.
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
}
}
Vous configurez l'objet HandoffActivityData avec tous les extras pertinents et un URI de remplacement pour indiquer à Continue On comment effectuer le transfert vers l'appareil de réception.
Le système a besoin de ces données dans deux situations :
- L'activité passe en arrière-plan et les données pertinentes doivent être enregistrées.
- L'activité est au premier plan et le transfert a été demandé. Vous pouvez vérifier l'état d'une demande de transfert.
Vérifier l'état
La classe HandoffActivityDataRequestInfo fournit des informations sur la requête actuelle de transfert d'une activité. Utilisez isActiveRequest pour déterminer si la requête est actuellement active. Si la méthode renvoie
- true, l'activité en cours est au premier plan et l'utilisateur a demandé à continuer sur un autre appareil. Toutefois, si
- false, l'activité s'est arrêtée et s'exécute en arrière-plan, mais l'utilisateur peut demander un transfert ultérieurement.
Sur l'appareil émetteur, si vous souhaitez afficher une UI pour indiquer à l'utilisateur qu'un transfert a eu lieu ou est en cours, vous pouvez vérifier isActiveRequest pour une requête active. Toutefois, n'exécutez pas ce code de manière synchrone dans onHandoffActivityDataRequested. À la place, mettez en file d'attente tout code à exécuter de manière asynchrone afin de ne pas bloquer ni retarder le transfert.
// 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
}
Créer des données de transfert
Pour vous assurer que toutes les données pertinentes et nécessaires sont transmises lors du transfert avec la fonctionnalité "Continuer sur", vous devez inclure les données dans l'objet HandoffActivityData.
La classe HandoffActivityData représente les données de transfert associées à une activité. HandoffActivityData indique à "Continuer sur" comment gérer et recréer une activité sur l'appareil de réception. Les données de transfert incluent :
- Nom du composant (obligatoire) :
ComponentNamed'une activité correspondante à lancer sur l'appareil de réception pour reprendre le parcours de l'utilisateur après le transfert. Dans la plupart des cas et pour une réplication exacte de l'activité, il s'agit du nom du composant de l'activité qui crée leHandoffActivityData. - Extras (facultatif) : vous pouvez spécifier des extras qui seront inclus dans le
Intentde démarrage de l'activité. Il s'agit d'unPersistableBundlequi peut être utilisé pour fournir des informations supplémentaires au composant. La taille des extras doit être inférieure à 50 ko.
Pour créer des objets HandoffActivityData, utilisez la classe de compilateur HandoffActivityData.Builder. Créez un compilateur en transmettant le ComponentName de l'activité qui doit recevoir le transfert (par exemple, this.getComponentName pour l'Activity actuel ou un ComponentName(this, TargetActivity::class.java) explicite). Utilisez ensuite la méthode setExtras pour spécifier éventuellement des extras. Enfin, appelez build pour créer l'objet 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()
}
Définir l'option de remplacement Web
Si l'activité spécifiée ne peut pas être lancée sur l'appareil de réception, vous pouvez également utiliser setFallbackUri pour définir une URL de remplacement qui s'ouvre sur l'appareil dans le navigateur par défaut de l'utilisateur.
Pour autoriser l'affichage de la suggestion "Continuer sur" sur les appareils de réception sur lesquels votre application n'est pas installée, transmettez une instance HandoffActivityParams avec setAllowHandoffWithoutPackageInstalled défini sur true lors de l'appel de setHandoffEnabled :
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
Ensuite, incluez l'URL de remplacement dans votre HandoffActivityData :
val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.setFallbackUri(fallbackWebLink)
.build()
Implémenter la redirection directe vers le Web
Vous pouvez également implémenter le transfert direct vers le Web en transmettant HandoffActivityParams avec setAllowHandoffWithoutPackageInstalled(true) à setHandoffEnabled, et en utilisant la méthode HandoffActivityData.createWebHandoff pour générer le HandoffActivityData :
val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)
Recevoir et gérer l'intent de transfert
Sur l'appareil de réception, votre application doit gérer le transfert et recréer l'expérience utilisateur de l'appareil d'envoi. Plus précisément, dans l'activité que vous avez spécifiée dans le HandoffActivityData renvoyé par onHandoffActivityDataRequested, vous devez gérer l'intent et récupérer les extras contenant des informations sur la manière de recréer l'activité de manière appropriée.
Si vous spécifiez le transfert vers la même activité, vous pouvez recevoir l'intent dans la méthode onCreate de l'activité afin que les données puissent être récupérées et préremplies de manière appropriée pour l'utilisateur.
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
...
}
}
}
}