Pratiche consigliate

App per dispositivi pieghevoli e multischermo

In genere, le app non devono fare affidamento su identificatori statici o logiche che dipendono da alcuni ID display. Nella maggior parte dei casi, le app devono ridimensionarsi e funzionare su display diversi e il sistema deve controllare dove individuarle. 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, SystemUI (o un altro componente di sistema) dovrebbe rilevare il fold, determinare se è appropriato eseguire un'azione, quindi avviare l'attività target e specificare un ID display esterno come target di lancio. Le app non devono rilevare questa azione o eseguire alcuna azione di risposta ed eseguire l'avvio su un display specifico. In altre parole, non dare per scontato che quello che funziona su un dispositivo funzioni su altri. In breve, il codice specifico per dispositivo aumenta la frammentazione.

Limitare l'accesso alle visualizzazioni

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 contrassegnare questi display come privati. In questo modo, tutti tranne il proprietario non potranno aggiungere contenuti alla visualizzazione. Qualsiasi tentativo di avvio di un'attività o di aggiunta di una finestra da parte di chiunque tranne il proprietario genera un SecurityException. Se il sistema è proprietario del display, può aggiungere finestre e avviare attività.

Inoltre, le entità posizionate su un display possono sempre accedervi. Se il proprietario avvia un'attività su un display, l'attività può avviare altre attività su questo display. Di conseguenza, è responsabilità del proprietario limitare l'accesso e consentire solo le app attendibili.

Inoltre, vengono aggiunte altre limitazioni 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à con allowEmbedded e il chiamante deve avere l'autorizzazione ACTIVITY_EMBEDDING.

Per ulteriori informazioni, consulta:

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

Per controllare in modo condizionale l'avvio 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 funzionalità è disponibile in system_server.

Configura le impostazioni di windowing del display e decorazioni del sistema

Le Decorazioni del 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 del sistema (Avvio app, sfondo, barra di navigazione e altre finestre di arredamento) e l'IME vengono visualizzati su un display. Per maggiori dettagli, consulta DisplayWindowSettings#shouldShowSystemDecorsLocked() e DisplayWindowSettings#shouldShowImeLocked().

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

Ad esempio, il seguente esempio di configurazione di visualizzazione abilita le decorazioni del sistema e l'IME su una visualizzazione simulata:

<?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 riportato sopra, 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 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 maggiori dettagli, consulta la sezione Identificatori di visualizzazione statici.

Per ulteriori informazioni, consulta: