Le reti satellitari un giorno saranno abbastanza robuste da funzionare come reti normali e funzionare perfettamente con tutti i casi d'uso delle app, ma per ora i dati su queste reti sono una risorsa scarsa. Una rete basata su satellite con limitazioni all'utilizzo dei dati è chiamata rete satellitare vincolata.
A causa di questi vincoli, le app per Android non utilizzano queste reti per impostazione predefinita. Se vuoi che la tua app funzioni su reti satellitari con limitazioni, devi identificare la tua app come ottimizzata per l'utilizzo dei dati satellitari e adattare i casi d'uso dell'app per risparmiare risorse quando è connessa a una rete satellitare con limitazioni.
Adattare i casi d'uso della tua app
Per consentire alla tua app di accedere a reti satellitari con limitazioni, devi solo attivare l'opzione, ma potresti dover apportare ulteriori modifiche per ottimizzare il comportamento dell'app e utilizzare le risorse di rete limitate in modo responsabile. Ecco alcuni aspetti da considerare quando esegui l'ottimizzazione per l'utilizzo limitato dei dati:
- Decidi se la tua app è adatta all'uso su reti con limitazioni. Alcune app non sono adatte a reti con limiti di dati in nessuna circostanza. Ad esempio, le app di streaming video potrebbero scegliere di non utilizzare affatto le reti satellitari, anche se potrebbero comunque identificare la presenza di una rete satellitare e informare l'utente che non funzioneranno sulla rete limitata esistente.
- Identifica casi d'uso specifici da limitare o modificare. Alcune funzionalità della tua app potrebbero essere più adatte di altre a condizioni di dati limitati. Ad esempio, l'invio di messaggi di testo funzionerebbe bene, ma il tentativo di caricare video HD probabilmente comporterebbe un'esperienza utente negativa. Questo è simile al modo in cui molte app cambiano comportamento in roaming.
- Adattare il modo in cui l'app utilizza le risorse di rete. Le reti con limitazioni funzionano meglio quando le app eseguono operazioni di rete a intervalli e non utilizzano la rete per la maggior parte del tempo. Evita di creare traffico di rete costante o eccessivo. Ad esempio, l'audio push-to-talk è molto più adatto a condizioni di rete vincolate rispetto alle chiamate audio in tempo reale.
Devi anche apportare modifiche specifiche se la tua app utilizza una logica di rete complessa o Firebase Cloud Messaging.
Identificarsi come ottimizzato per reti con limitazioni
Per identificare la tua app come ottimizzata per le reti con limitazioni e attivare il loro utilizzo, aggiorna il file manifest dell'app con un elemento
<meta-data>
come segue:
<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
android:value="PACKAGE_NAME" />
Questo elemento consente all'app di utilizzare una rete satellitare vincolata quando è l'unica rete disponibile. Inoltre, comunica al sistema che la tua app è ottimizzata per le reti con limitazioni, facilitando la scoperta da parte degli utenti elencandola tra le app abilitate per il satellite nell'app Impostazioni.
Modificare il comportamento in condizioni di dati vincolati
Se devi modificare il comportamento della tua app quando utilizzi una rete con limitazioni o
se la tua app ha una logica preesistente che utilizza
ConnectivityManager
per gestire l'utilizzo della rete, dovrai
apportare alcune modifiche al flusso di rete.
Rilevare le condizioni dei dati vincolati
L'oggetto NetworkCapabilities
utilizzato per le richieste di rete include un bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
impostato per impostazione predefinita su tutte le reti e rimosso su quelle con larghezza di banda limitata. Puoi determinare se una rete è
con larghezza di banda limitata controllando se dispone o meno della
funzionalità NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
.
Lavorare con reti vincolate
Gli oggetti NetworkRequest
includono anche la funzionalità
NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
per impostazione predefinita. Rimuovi questa
funzionalità per indicare che le reti con limitazioni sono accettabili.
Quando rilevi di esserti connesso a una rete con limitazioni, puoi adattare le funzionalità della tua app in base alle necessità:
Kotlin
val HandlerThread = HandlerThread("SatelliteNetworkMonitor" handlerThread.start() val handler = Handler(handlerThread.getLooper()) // Make the network request. val request = NetworkRequest.Builder() .addCapability(NET_CAPABILITY_INTERNET .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) .build() // Register for the callback. val callback = NetworkCallback() { override fun onCapabilitiesChanged(net: Network, nc: NetWorkCapabilities) { updateAppUseCases(net, nc) } fun updateAppUseCases(net: Network, nc: NetworkCapabilities) { if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) || nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) { // Adapt to constrained network or disable heavy data usage features. ... } else { // Revert to unconstrained behavior. ... } } } // Where cm is your ConnectivityManager object: cm.registerBestMatchingNetworkCallback(request, callback, handler)
Java
HandlerThread handlerThread = new HandlerThread("SatelliteNetworkMonitor"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); // Make the network request. NetworkRequest request = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_INTERNET) .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) .build(); // Register for the callback. NetworkCallback callback = new NetworkCallback() { @Override public void onCapabilitiesChanged(Network net, NetworkCapabilities nc) { updateAppUsecases(net, nc); } private void updateAppUsecases(Network net, NetworkCapabilities nc) { if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) || nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) { // Adapt to constrained network or disable heavy data usage features. ... } else { // Revert to unconstrained behavior. ... } } }; // Where cm is your ConnectivityManager object: cm.registerBestMatchingNetworkCallback(request, callback, handler);
Ricevere messaggi FCM su reti con limitazioni
Se la tua app utilizza Firebase Cloud Messaging (FCM) per ricevere messaggi
da un server app, puoi indicare che un messaggio specifico deve essere recapitato
anche su reti con limitazioni includendo il flag bandwidth_constrained_ok
quando passi il messaggio al server FCM:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
"android": {
"bandwidth_constrained_ok": true
}
}
}
Se un messaggio non include questo flag, il server FCM lo invia solo quando il dispositivo è connesso tramite una rete senza limitazioni.