App per dispositivi pieghevoli e multischermo
In generale, le app non devono fare affidamento su identificatori statici o su una logica che dipende da alcuni ID display. Nella maggior parte dei casi, le app devono essere ridimensionate e funzionare su schermi 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 piega, determinare se è opportuno eseguire un'azione e quindi avviare l'attività di destinazione e specificare un ID display esterno come destinazione di avvio. Le app non devono rilevare questa azione o eseguirne alcuna in risposta e poi eseguire l'avvio su un display specifico. In altre parole, non dare per scontato che ciò che funziona su un dispositivo funzionerà anche sugli altri. 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, ti consigliamo di utilizzare il flag Display#FLAG_PRIVATE
per designare questi display come privati. In questo modo, solo il proprietario può aggiungere contenuti alla visualizzazione. Qualsiasi tentativo di avviare un'attività o di
aggiungere 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 accedere a quest'ultimo. Se il proprietario avvia un'attività su un display, questa può avviare altre attività sullo stesso display. Di conseguenza, il proprietario è responsabile della limitazione dell'accesso e dell'autorizzazione delle app attendibili solo.
Inoltre, vengono aggiunte ulteriori 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 disporre dell'autorizzazione ACTIVITY_EMBEDDING
.
Per ulteriori informazioni, consulta:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Per controllare in modo condizionale gli avvii di attività, utilizza LaunchParamsController
,
che intercetta tutti gli avvii di attività e consente a un componente di sistema di modificare i
parametri utilizzati per l'avvio. Questa opzione è disponibile in system_server
.
Configurare le impostazioni di visualizzazione a finestre e le decorazioni del sistema
Le decorazioni di sistema possono
essere configurate per display in DisplayWindowSettings
. L'implementazione di un dispositivo può fornire una configurazione predefinita in /data/system/display_settings.xml
.
Questo valore determina se le decorazioni di sistema (launcher, 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 (questa impostazione predefinita utilizza
DisplayInfo#uniqueId
) o un ID porta fisica per i display
hardware (vedi DisplayInfo#address
).
Ad esempio, la seguente configurazione di visualizzazione 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 del display
nell'attributo name, che per un display simulato è 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, vedi Identificatori display statici.
Per ulteriori informazioni, consulta: