Uygulamanızda ağ işlemleri gerçekleştirmek için manifest dosyanız şunları içermelidir: aşağıdaki izinler:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Güvenli ağ iletişimi için en iyi uygulamalar
Uygulamanıza ağ iletişimi işlevi eklemeden önce bir veri ve bilgi kaynağı üzerinden veri aktarırken, uygulamanızdaki verilerin ve bilgilerin ağ. Bunun için aşağıdaki ağ güvenliğiyle ilgili en iyi uygulamaları uygulayın:
- Hassas veya kişisel kullanıcı sayısını en aza indirin verileri ağ.
- Uygulamanızdan gelen tüm ağ trafiğini SSL üzerinden gönderin.
- Bir ağ güvenliği oluşturmayı düşünün Bu yapılandırma, uygulamanızın özel sertifika yetkililerine (CA) güvenme veya sistem CA'ları grubunu kısıtlama güvenli iletişim için güvende olduğunu ifade eder.
Güvenli ağ oluşturma ilkelerinin nasıl uygulanacağı hakkında daha fazla bilgi için ağ güvenliğiyle ilgili ipuçlarına göz atın.
HTTP istemcisi seçin
Ağa bağlı uygulamaların çoğu, veri göndermek ve almak için HTTP kullanır. Android
platform,
HttpsURLConnection
müşterisi,
TLS, akış yükleme ve indirmeleri, yapılandırılabilir zaman aşımları ve
IPv6 ve bağlantı havuzu oluşturma.
Ağ işlemleri için daha üst düzey API'ler sunan üçüncü taraf kitaplıklar da kullanılabilir. Bunlar, istek gövdelerinin serileştirilmesi ve yanıt gövdelerinin seri durumdan çıkarılması.
- Retrofit: Tür açısından güvenli bir HTTP Gemini için, OkHttp'nin üzerine inşa edilmiş Square'den JVM'nin müşterisidir. Güçlendirme şunları sağlar: bildirerek bir istemci arayüzü oluşturabilir ve serileştirme kitaplığıdır.
- Ktor: JetBrains'in tamamen Kotlin için geliştirilmiş ve eş yordamlarla desteklenen bir HTTP istemcisidir. Ktor çeşitli motorları destekler, serileştiriciler ve platformlar.
DNS sorgularını çözme
Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda hem açık metin aramalar hem de DNS-over-TLS modu aracılığıyla özel DNS aramaları için yerleşik destek bulunur.
DnsResolver
API, genel,
SRV
, NAPTR
ve diğerlerini aramanızı sağlayan eşzamansız çözünürlük
kayıt türleri. Yanıtın ayrıştırılması, gerçekleştirilecek uygulamaya bırakılır.
Android 9 (API düzeyi 28) ve önceki sürümleri çalıştıran cihazlarda platform DNS'si
çözümleyici yalnızca A
ve AAAA
kayıtlarını destekler. Bu, IP adresini aramanıza
bir adla ilişkili olan ancak başka hiçbir kayıt türünü desteklemeyen adresler
NDK tabanlı uygulamalar için bkz.
android_res_nsend
.
Ağ işlemlerini bir depo ile kapsülleme
Ağ işlemleri gerçekleştirme sürecini basitleştirmek ve kod sayısını azaltmak için uygulamanızın çeşitli bölümlerinde kopya kullanırken kod deposu tasarımını desen. Depo, veri işlemlerini gerçekleştiren ve bazı veriler veya kaynaklar üzerinde net API soyutlaması sağlar.
Retrofit özelliğini kullanarak HTTP yöntemini, Aşağıdaki gibi ağ işlemleri için URL, bağımsız değişkenler ve yanıt türü örnek:
Kotlin
interface UserService { @GET("/users/{id}") suspend fun getUser(@Path("id") id: String): User }
Java
public interface UserService { @GET("/user/{id}") Call<User> getUserById(@Path("id") String id); }
Depo sınıfı içindeki işlevler, ağ işlemlerini ve bu işlemleri ve sonuçlarını gösterir. Bu kapsülleme, deposu çağıran bileşenlerin verilerin nasıl depolandığını bilmesi gerekmediğinden emin olur. Gelecekteki verilerin nasıl depolandığı da depo sınıfından izole edilir. Örneğin, API uç noktalarında güncelleme gibi uzak bir değişikliğiniz olabilir veya yerel önbelleğe alma özelliğini uygulamak isteyebilirsiniz.
Kotlin
class UserRepository constructor( private val userService: UserService ) { suspend fun getUserById(id: String): User { return userService.getUser(id) } }
Java
class UserRepository { private UserService userService; public UserRepository( UserService userService ) { this.userService = userService; } public Call<User> getUserById(String id) { return userService.getUser(id); } }
Yanıt vermeyen kullanıcı arayüzü oluşturmaktan kaçınmak için
ana ileti dizisidir. Android varsayılan olarak
iş parçacığı (ör. ana kullanıcı arayüzü iş parçacığı) değil. Ağ işlemleri gerçekleştirmeye çalışırsanız
ana ileti dizisinde,
NetworkOnMainThreadException
atılır.
Önceki kod örneğinde,
ağ işlemi tetiklenmez. UserRepository
çağıran
ileti dizisi işlemini eş yordamlar veya enqueue()
kullanarak uygulamalıdır
işlevini kullanın. Daha fazla bilgi için Kotlin coroutine'lerini kullanarak iş parçacığı oluşturmanın nasıl uygulandığını gösteren İnternetten veri alma kod laboratuvarına bakın.
Yapılandırma değişikliklerinden kurtulma
Ekran döndürme gibi bir yapılandırma değişikliği gerçekleştiğinde, etkinlik kaldırılır ve yeniden oluşturulur. Örnekte kaydedilmemiş olan tüm veriler küçük miktarda veri barındırabilen parça etkinliğinizin durumunu gösterir, kayboldu. Bu durumda, ağ isteklerinizi tekrar göndermeniz gerekebilir.
Aşağıdakileri yapmak için ViewModel
kullanabilirsiniz:
yapılandırma değişikliklerinden ViewModel
bileşeni
Kullanıcı arayüzüyle ilgili verileri yaşam döngüsüne duyarlı bir şekilde depolayıp yönetmek için
sağlar. Önceki UserRepository
kullanıldığında ViewModel
şunları yapabilir:
ve sonucu parçanıza veya etkinliğinize sağlayın
LiveData
kullanarak:
Kotlin
class MainViewModel constructor( savedStateHandle: SavedStateHandle, userRepository: UserRepository ) : ViewModel() { private val userId: String = savedStateHandle["uid"] ?: throw IllegalArgumentException("Missing user ID") private val _user = MutableLiveData<User>() val user = _user as LiveData<User> init { viewModelScope.launch { try { // Calling the repository is safe as it moves execution off // the main thread val user = userRepository.getUserById(userId) _user.value = user } catch (error: Exception) { // Show error message to user } } } }
Java
class MainViewModel extends ViewModel { private final MutableLiveData<User> _user = new MutableLiveData<>(); LiveData<User> user = (LiveData<User>) _user; public MainViewModel( SavedStateHandle savedStateHandle, UserRepository userRepository ) { String userId = savedStateHandle.get("uid"); Call<User> userCall = userRepository.getUserById(userId); userCall.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if (response.isSuccessful()) { _user.setValue(response.body()); } } @Override public void onFailure(Call<User> call, Throwable t) { // Show error message to user } }); } }
İlgili kılavuzları okuyun
Bu konuyla ilgili daha fazla bilgi edinmek için aşağıdaki ilgili kılavuzlara göz atın:
- Ağ pil tüketimini azaltma: Genel bakış
- Düzenli güncellemelerin etkisini en aza indirme
- Web tabanlı içerik
- Uygulamayla ilgili temel bilgiler
- Uygulama mimarisi rehberi