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ù display, ti consigliamo di utilizzare il flag Display#FLAG_PRIVATE
per designare questi 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 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, 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 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 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 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 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:
- Impostazioni della finestra del display
- Identificatori di visualizzazione statici
- Supporto delle decorazioni di sistema