Pratiche consigliate

App per dispositivi pieghevoli e multischermo

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

In questo caso, SystemUI (o un altro componente di sistema) dovrebbe rilevare la piegatura, determinare se è appropriato eseguire un'azione, quindi avviare l'attività di destinazione e specificare un ID di visualizzazione esterno come destinazione di avvio. Le app non dovrebbero rilevare questa azione o eseguire alcuna azione in risposta e quindi eseguire l'avvio su un display specifico. In altre parole, 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, si consiglia di utilizzare il flag Display#FLAG_PRIVATE per designare tali display come privati . In questo modo si impedisce a tutti tranne che al proprietario di aggiungere contenuti al display. Qualsiasi tentativo di avviare un'attività o di aggiungere una finestra da parte di chiunque tranne il proprietario risulta in una SecurityException . Se il sistema possiede il display, il sistema può aggiungere finestre e avviare attività.

Inoltre, le entità posizionate su una visualizzazione possono sempre accedere a quella visualizzazione. Se il proprietario avvia un'attività su un display, l'attività può avviare altre attività su questo display. Di conseguenza, il proprietario è responsabile di limitare l'accesso e consentire solo le app attendibili .

Inoltre, vengono aggiunte ulteriori restrizioni ai display virtuali 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à allowEmbedded e il chiamante deve disporre dell'autorizzazione ACTIVITY_EMBEDDING .

Per ulteriori informazioni, vedere:

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

Per controllare in modo condizionale i lanci di attività, utilizzare LaunchParamsController , che intercetta tutti i lanci di attività e consente a un componente di sistema di modificare i parametri utilizzati per il lancio. Questo è disponibile in system_server .

Configura le impostazioni delle finestre di visualizzazione e le decorazioni del 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 (avviatore di avvio, sfondo, barra di navigazione e altre finestre di decorazione) e l'IME vengono visualizzati su un display. Per i dettagli, vedere DisplayWindowSettings#shouldShowSystemDecorsLocked() e DisplayWindowSettings#shouldShowImeLocked() .

Per identificare il display, utilizzare un ID univoco (per impostazione predefinita viene utilizzato DisplayInfo#uniqueId ) o un ID di porta fisica per i display hardware (vedere DisplayInfo#address ).

Ad esempio, il seguente esempio di configurazione del display abilita 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 della visualizzazione nell'attributo name, che per una visualizzazione simulata è overlay:1 . Per un display integrato, un valore di esempio può essere "local:45354385242535243453" . Un'altra opzione consiste nell'utilizzare le informazioni sulla porta hardware e impostare identifier="1" in modo che corrisponda a DisplayWindowSettings#IDENTIFIER_PORT e quindi aggiornare il nome per utilizzare 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 maggiori dettagli, consulta Identificatori di visualizzazione statici .

Per ulteriori informazioni, vedere: