Für eingeschränkte Satellitennetzwerke entwickeln

Satellitennetzwerke werden eines Tages robust genug sein, um als normale Netzwerke zu fungieren und nahtlos mit allen App-Anwendungsfällen zusammenzuarbeiten. Derzeit sind Daten in diesen Netzwerken jedoch eine knappe Ressource. Ein satellitenbasiertes Netzwerk mit Einschränkungen bei der Datennutzung wird als eingeschränktes Satellitennetzwerk bezeichnet.

Aufgrund dieser Einschränkungen werden diese Netzwerke in Android-Apps standardmäßig nicht verwendet. Wenn Ihre App in eingeschränkten Satellitennetzwerken funktionieren soll, müssen Sie Ihre App als für die Satellitendatennutzung optimiert kennzeichnen und die Anwendungsfälle Ihrer App anpassen, um Ressourcen zu schonen, wenn sie mit einem eingeschränkten Satellitennetzwerk verbunden ist.

Anwendungsfälle Ihrer App anpassen

Sie müssen nur die Option aktivieren, damit Ihre App auf eingeschränkte Satellitennetzwerke zugreifen kann. Möglicherweise sind jedoch weitere Änderungen erforderlich, um das Verhalten Ihrer App zu optimieren und begrenzte Netzwerkressourcen verantwortungsbewusst zu nutzen. Hier sind einige Punkte, die Sie bei der Optimierung für eine eingeschränkte Datennutzung beachten sollten:

  • Entscheiden Sie, ob Ihre App für die Verwendung in eingeschränkten Netzwerken geeignet ist. Einige Apps sind unter keinen Umständen für datenbeschränkte Netzwerke geeignet. Videostreaming-Apps können beispielsweise Satellitennetzwerke vollständig deaktivieren. Sie können aber trotzdem erkennen, ob ein Satellitennetzwerk vorhanden ist, und den Nutzer darüber informieren, dass die App im vorhandenen eingeschränkten Netzwerk nicht funktioniert.
  • Bestimmte Anwendungsfälle identifizieren, die eingeschränkt oder geändert werden sollen: Einige Funktionen Ihrer App eignen sich möglicherweise besser für Bedingungen mit begrenzten Daten als andere. Das Senden von SMS funktioniert beispielsweise gut, das Hochladen von HD-Videos führt jedoch wahrscheinlich zu einer schlechten Nutzererfahrung. Das ist ähnlich wie bei vielen Apps, die ihr Verhalten im Roaming ändern.
  • Anpassen der Art und Weise, wie Ihre App Netzwerkressourcen verwendet Netzwerke mit eingeschränkter Bandbreite funktionieren am besten, wenn Apps Netzwerkvorgänge in Bursts ausführen und die meiste Zeit das Netzwerk nicht nutzen. Vermeiden Sie ständigen oder geschwätzigen Netzwerkverkehr. Push-to-Talk-Audio ist beispielsweise viel besser für eingeschränkte Netzwerkbedingungen geeignet als Echtzeit-Audioanrufe.

Wenn Ihre App komplexe Netzwerklogik oder Firebase Cloud Messaging verwendet, müssen Sie außerdem bestimmte Änderungen vornehmen.

Als für eingeschränkte Netzwerke optimiert kennzeichnen

Wenn Sie Ihre App als für eingeschränkte Netzwerke optimiert kennzeichnen und die Verwendung dieser Netzwerke aktivieren möchten, aktualisieren Sie die App-Manifestdatei mit einem <meta-data>-Element wie folgt:

<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
          android:value="PACKAGE_NAME" />

Mit diesem Element kann Ihre App ein eingeschränktes Satellitennetzwerk verwenden, wenn es das einzige verfügbare Netzwerk ist. Außerdem wird dem System mitgeteilt, dass Ihre App für Netzwerke mit eingeschränkter Bandbreite optimiert ist. Dies kann dazu beitragen, dass Nutzer Ihre App leichter finden, da sie in den Einstellungen unter den für Satelliten optimierten Apps aufgeführt wird.

Verhalten bei eingeschränkten Daten ändern

Wenn Sie das Verhalten Ihrer App bei Verwendung eines eingeschränkten Netzwerks ändern müssen oder Ihre App bereits Logik verwendet, die ConnectivityManager zur Verwaltung der Netzwerknutzung verwendet, müssen Sie einige Änderungen an Ihrem Netzwerkablauf vornehmen.

Bedingungen für eingeschränkte Daten erkennen

Das für Netzwerkanfragen verwendete NetworkCapabilities-Objekt enthält das Bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED, das standardmäßig für alle Netzwerke festgelegt und für Netzwerke mit Bandbreitenbeschränkung entfernt wird. Ob ein Netzwerk bandbreitenbeschränkt ist, können Sie daran erkennen, ob es die Funktion NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED hat.

Mit eingeschränkten Netzwerken arbeiten

NetworkRequest-Objekte enthalten standardmäßig auch die NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED-Funktion. Entfernen Sie diese Funktion, um anzugeben, dass eingeschränkte Netzwerke akzeptabel sind.

Wenn Sie feststellen, dass Sie mit einem eingeschränkten Netzwerk verbunden sind, können Sie die Funktionen Ihrer App nach Bedarf anpassen:

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);

FCM-Nachrichten in eingeschränkten Netzwerken empfangen

Wenn Ihre App Firebase Cloud Messaging (FCM) verwendet, um Nachrichten von einem App-Server zu empfangen, können Sie angeben, dass eine bestimmte Nachricht auch in eingeschränkten Netzwerken zugestellt werden soll. Dazu müssen Sie das Flag bandwidth_constrained_ok einfügen, wenn Sie die Nachricht an den FCM-Server übergeben:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
    "android": {
       "bandwidth_constrained_ok": true
    }
  }
}

Wenn eine Nachricht dieses Flag nicht enthält, wird sie vom FCM-Server nur zugestellt, wenn das Gerät über ein Netzwerk ohne Einschränkungen verbunden ist.