Pratiche consigliate

App per dispositivi pieghevoli e multischermo

In genere, le app non devono basarsi 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 dovrebbe controllare dove trovare le app. Ad esempio, per creare una per i dispositivi pieghevoli e lancia un'app speciale sul schermo esterno quando il dispositivo è chiuso.

In questo caso, SystemUI (o un altro componente di sistema) dovrebbe rilevare piega, determina se è opportuno eseguire un'azione e avvia il l'attività target e specifica un ID display esterno come target di lancio. Le app non devono rilevare questa azione o eseguire qualsiasi azione di risposta, quindi eseguire l'avvio su un display specifico. In altre parole, non dare per scontato che ciò che funziona su un dispositivo funzionerà su altri dispositivi. In breve, un modello specifico per dispositivo il codice aumenta la frammentazione.

Limita l'accesso ai display

Se la configurazione del dispositivo richiede la limitazione dell'accesso a uno o più visualizzato, il consiglio è di usare il flag Display#FLAG_PRIVATE per impostare tali display come privati. In questo modo limiti tutti tranne proprietario di aggiungere contenuti alla visualizzazione. Qualsiasi tentativo di avviare un'attività o di aggiungi una finestra da chiunque, ma il proprietario genera un SecurityException. Se il sistema è di proprietà 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 e autorizzare le app attendibili solo.

Vengono inoltre aggiunte ulteriori limitazioni ai display virtuali perché qualsiasi app può puoi crearne uno senza renderlo visibile all'utente. Se il display virtuale non è di proprietà del sistema, vengono considerate soltanto le attività con allowEmbedded sono consentiti e il chiamante deve avere il ACTIVITY_EMBEDDING autorizzazione.

Per ulteriori informazioni, consulta:

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

Per controllare in modo condizionale i lanci delle attività, usa LaunchParamsController, che intercetta tutti i avvii di attività e consente a un componente di sistema di modificare utilizzati per il lancio. Questa funzionalità è disponibile in system_server.

Configura le impostazioni di windowing del display e decorazioni del sistema

Le decorazioni del sistema possono da configurare per ogni visualizzazione in DisplayWindowSettings. Un dispositivo può fornire una configurazione predefinita /data/system/display_settings.xml.

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

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

Ad esempio, il seguente esempio di configurazione di visualizzazione abilita le decorazioni del sistema 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 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 aggiorna 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 la sezione Identificatori di visualizzazione statici.

Per ulteriori informazioni, consulta: