Uydu ağları bir gün normal ağlar gibi çalışacak ve tüm uygulama kullanım alanlarıyla sorunsuz bir şekilde çalışacak kadar güçlü olacak. Ancak şu anda bu ağlardaki veriler kıt bir kaynak. Veri kullanımıyla ilgili kısıtlamaları olan uydu tabanlı bir ağa kısıtlanmış uydu ağı denir.
Bu kısıtlamalar nedeniyle Android uygulamaları, varsayılan olarak bu ağları kullanmaz. Uygulamanızın sınırlı uydu ağlarında çalışmasını istiyorsanız uygulamanızı uydu verisi kullanımı için optimize edilmiş olarak tanımlamanız ve sınırlı bir uydu ağına bağlandığında kaynakları korumak için uygulamanızın kullanım alanlarını uyarlamanız gerekir.
Uygulamanızın kullanım alanlarını uyarlama
Uygulamanızın sınırlı uydu ağlarına erişmesine izin vermek için tek yapmanız gereken özelliği etkinleştirmektir. Ancak sınırlı ağ kaynaklarını sorumlu bir şekilde kullanmak için uygulamanızın davranışını optimize etmek üzere başka değişiklikler yapmanız gerekebilir. Sınırlı veri kullanımı için optimizasyon yaparken dikkate almanız gereken bazı noktalar şunlardır:
- Uygulamanızın sınırlı ağlarda kullanıma uygun olup olmadığına karar verin. Bazı uygulamalar, hiçbir koşulda veri sınırlaması olan ağlar için uygun değildir. Örneğin, video akışı uygulamaları uydu ağlarının varlığını belirleyip kullanıcıya mevcut sınırlı ağda çalışmayacaklarını bildirebilseler de uydu ağlarını hiç kullanmamayı tercih edebilir.
- Sınırlanacak veya değiştirilecek belirli kullanım alanlarını belirleyin. Uygulamanızın bazı özellikleri, sınırlı veri koşullarına diğerlerinden daha uygun olabilir. Örneğin, kısa mesaj gönderme işlemi sorunsuz çalışır ancak HD video yükleme girişimi muhtemelen kötü bir kullanıcı deneyimine yol açar. Bu, birçok uygulamanın dolaşım sırasında davranışını değiştirme şekline benzer.
- Uygulamanızın ağ kaynaklarını kullanma şeklini uyarlayın. Kısıtlanmış ağlar, uygulamalar ağ işlemlerini aralıklarla gerçekleştirdiğinde ve zamanın çoğunu ağı kullanmadan geçirdiğinde en iyi şekilde çalışır. Sürekli veya sohbetli ağ trafiği oluşturmaktan kaçının. Örneğin, bas-konuş ses özelliği, sınırlı ağ koşullarında gerçek zamanlı sesli aramalara kıyasla çok daha uygundur.
Uygulamanız karmaşık ağ mantığı veya Firebase Cloud Messaging kullanıyorsa yapmanız gereken belirli değişiklikler de vardır.
Kısıtlı ağlar için optimize edilmiş olarak tanımlama
Uygulamanızı sınırlı ağlar için optimize edilmiş olarak tanımlamak ve bu ağları kullanmayı etkinleştirmek için uygulama manifest dosyanızı aşağıdaki gibi bir <meta-data>
öğesiyle güncelleyin:
<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
android:value="PACKAGE_NAME" />
Bu öğe, uygulamanızın yalnızca sınırlı bir uydu ağı kullanılabildiğinde bu ağı kullanmasına olanak tanır. Ayrıca, uygulamanızın sınırlı ağlar için optimize edildiğini sisteme bildirir. Bu sayede, ayarlar uygulamasında uydu özellikli uygulamalar arasında listelenerek kullanıcıların uygulamanızı keşfetmesine yardımcı olur.
Kısıtlanmış veri koşullarında davranışı değiştirme
Kısıtlanmış bir ağ kullanırken uygulamanızın davranışını değiştirmeniz gerekiyorsa veya uygulamanızda ağ kullanımını yönetmek için ConnectivityManager
kullanan önceden var olan bir mantık varsa ağ akışınızda bazı değişiklikler yapmanız gerekir.
Kısıtlanmış veri koşullarını algılama
Ağ istekleri için kullanılan NetworkCapabilities
nesnesi, tüm ağlarda varsayılan olarak ayarlanan ve bant genişliği sınırlı ağlarda kaldırılan bir NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
biti içerir. Bir ağın bant genişliği sınırlı olup olmadığını NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
özelliğinin olup olmadığını kontrol ederek belirleyebilirsiniz.
Kısıtlanmış ağlarla çalışma
NetworkRequest
nesneleri varsayılan olarak NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
özelliğini de içerir. Kısıtlanmış ağların kabul edilebilir olduğunu belirtmek için bu özelliği kaldırın.
Kısıtlanmış bir ağa bağlandığınızı tespit ettiğinizde uygulamanızın özelliklerini gerektiği gibi uyarlayabilirsiniz:
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);
Kısıtlı ağlarda FCM mesajları alma
Uygulamanız, bir uygulama sunucusundan mesaj almak için Firebase Cloud Messaging (FCM) kullanıyorsa mesajı FCM sunucusuna iletirken bandwidth_constrained_ok
işaretini ekleyerek belirli bir mesajın kısıtlı ağlarda bile teslim edilmesi gerektiğini belirtebilirsiniz:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
"android": {
"bandwidth_constrained_ok": true
}
}
}
Bir ileti bu işareti içermiyorsa FCM sunucusu, iletiyi yalnızca cihaz sınırsız bir ağ üzerinden bağlandığında teslim eder.