App per dispositivi pieghevoli e multischermo
In genere, le app non devono fare affidamento su identificatori o logiche statiche 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 posizionarle. 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) deve rilevare la chiusura, determinare se è opportuno eseguire un'azione, quindi avviare l'attività target e specificare un ID display esterno come target di avvio. Le app non devono rilevare questa azione o eseguire alcuna azione in risposta, quindi eseguire il lancio su un display specifico. In altre parole, non dare per scontato che ciò che funziona su un dispositivo funzioni anche su altri. In breve, il codice specifico per il dispositivo aumenta la frammentazione.
Limitare l'accesso alle visualizzazioni
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, tutti tranne il proprietario non potranno aggiungere contenuti alla visualizzazione. Qualsiasi tentativo di avviare un'attività o di aggiungere una finestra da parte di chiunque non sia 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 una schermata, l'attività può avviare altre attività su questa schermata. 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 l'utente che effettua la chiamata deve disporre dell'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 opzione è disponibile in system_server
.
Configura le impostazioni di visualizzazione delle finestre 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 (avvio, 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 viene utilizzato DisplayInfo#uniqueId
) o un ID porta fisica per i display hardware (vedi DisplayInfo#address
).
Ad esempio, il seguente esempio di configurazione del display attiva 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 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 da 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, consulta: