Pratiche consigliate

Questa pagina presenta consigli per l'utilizzo di più display.

App per dispositivi pieghevoli e multi-schermo

In genere, le app non devono fare affidamento su identificatori statici o logica che dipende da alcuni ID display. Nella maggior parte dei casi, le app devono ridimensionarsi e funzionare su display diversi e il sistema deve controllare dove posizionare le app. Ad esempio, per creare un'esperienza nuova e unica per i dispositivi pieghevoli e avviare un'app speciale sullo schermo esterno quando il dispositivo è piegato.

In questo caso, l'UI di sistema o un altro componente di sistema deve rilevare la piega, determinare se è appropriato eseguire un'azione, quindi avviare l'attività di destinazione e specificare un ID display esterno come target di avvio. Le app non devono rilevare questa azione o eseguire alcuna azione in risposta e quindi eseguire l'avvio su un display specifico. Pertanto, non dare per scontato che ciò che funziona su un dispositivo funzionerà anche su altri dispositivi. In breve, il codice specifico del dispositivo aumenta la frammentazione.

Limitare l'accesso ai display

Se la configurazione del dispositivo richiede la limitazione dell'accesso a uno o più display, ti consigliamo di utilizzare il flag Display#FLAG_PRIVATE per designare il display come privato. Questa designazione impedisce a tutti, tranne al proprietario, di aggiungere contenuti al display. Se un utente diverso dal proprietario tenta di avviare un'attività o di aggiungere una finestra, viene attivato SecurityException. Se il sistema è proprietario del display, può aggiungere finestre e avviare attività.

Inoltre, le entità posizionate su un display possono sempre accedere a quel display. Se il proprietario avvia un'attività su un display, l'attività può avviare altre attività su questo display. Di conseguenza, il proprietario è responsabile della limitazione dell'accesso e dell'autorizzazione solo delle app attendibili.

Inoltre, ai display virtuali vengono aggiunte ulteriori limitazioni perché qualsiasi app può crearne uno senza renderlo visibile all'utente. Se il display virtuale non è di proprietà del sistema, sono consentite solo le attività con allowEmbedded e il chiamante deve disporre dell'autorizzazione ACTIVITY_EMBEDDING.

Per ulteriori informazioni, vedi:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay
  • ActivityDisplay#isUidPresent
  • DisplayManagerService#isUidPresentOnDisplay

Per controllare in modo condizionale gli avvii delle attività, utilizza LaunchParamsController, che intercetta tutti gli avvii delle attività e consente a un componente di sistema di modificare i parametri utilizzati per l'avvio. Questa opzione è disponibile in system_server.

Configurare le impostazioni di finestre del display e le decorazioni di sistema

Le decorazioni di sistema possono essere configurate per display in DisplayWindowSettings. Un'implementazione del dispositivo può fornire una configurazione predefinita in /data/system/display_settings.xml.

Questo valore determina se le decorazioni di sistema (launcher, sfondo, barra di navigazione e altre finestre di decorazione) e l'IME vengono visualizzati su un display. Per i dettagli, vedi DisplayWindowSettings#shouldShowSystemDecorsLocked e DisplayWindowSettings#shouldShowImeLocked.

Per identificare il display, utilizza un ID univoco (il valore predefinito utilizza DisplayInfo#uniqueId) o un ID porta fisica per i display hardware (vedi DisplayInfo#address).

Ad esempio, la seguente configurazione del display consente le decorazioni di sistema e l'IME su un display simulato:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="0" />
<display
  name="overlay:1"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Nell'esempio precedente, uniqueId viene utilizzato per l'identificazione del display nell'attributo name, che per un display simulato è overlay:1. Per un display integrato, un valore di esempio potrebbe essere "local:45354385242535243453". Un'altra opzione è utilizzare le informazioni sulla porta hardware e impostare identifier="1" in modo che corrisponda a DisplayWindowSettings#IDENTIFIER_PORT, quindi aggiornare il nome in modo che utilizzi il formato "port:<port_id>":

<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="1" />
<display
  name="port:12345"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Per i dettagli, vedi Identificatori di display statici.

Per ulteriori informazioni, vedi:

Passare dalla duplicazione all'hosting delle attività sui display

In Android 17 e versioni successive, DisplayManager utilizza il FLAG_ALLOWS_CONTENT_MODE_SWITCH flag per controllare se un display passa dalla duplicazione all'hosting delle attività in fase di runtime. Per impostazione predefinita, questo flag è abilitato per i display esterni e disabilitato per tutti gli altri display.

Quando è presente FLAG_ALLOWS_CONTENT_MODE_SWITCH, DisplayManager monitora l'impostazione sicura android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY per determinare se duplicare o ospitare le attività. Sebbene questa sia la logica predefinita, gli OEM possono personalizzare questo comportamento.

Topologia del display e movimento del puntatore

In Android 17 e versioni successive, la topologia del display definisce le posizioni relative dei display e limita il movimento del puntatore del mouse al set specifico di display nella topologia.

WindowManager decide di includere un display nella topologia e chiama DisplayManagerInternal.onDisplayBelongToTopologyChanged. DisplayManager controlla DisplayTopologyCoordinator.isDisplayAllowedInTopology prima di aggiungere il display. Per impostazione predefinita, se i display locali possono ospitare attività, il sistema li aggiunge.

Se sono presenti più display pubblici che possono ospitare attività, la decisione di includere il display predefinito viene gestita dal provider booleano shouldIncludeDefaultDisplayInTopology passato a DisplayTopologyCoordinator. Se il display predefinito è l'unico display pubblico che può ospitare attività, è sempre presente nella topologia. In AOSP, il provider booleano restituisce true solo se il display predefinito supporta le finestre desktop o se l'impostazione sicura Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY è true.

Le app eseguono query sulla topologia corrente utilizzando DisplayManager.getDisplayTopology e reagiscono alle modifiche alla topologia registrando un listener con DisplayManager.registerTopologyListener.