Arka plan işlemleri bellek ve pili fazla kullanabilir. Örneğin, örtülü yayın, bir oturum açma sayfasına bu süreçler pek işe yaramasa bile onları dikkatle dinlemeniz gerekir. Bu, hem cihaz performansını hem de kullanıcı deneyimini önemli ölçüde etkiler.
Sistem kısıtlamalarıyla karşılaşmamak için arka plan görevi var. İlgili içeriği oluşturmak için kullanılan Arka plan görevlerine genel bakış belgeleri, doğru API'yi bulmanızı sağlar.
Kullanıcı tarafından başlatılan kısıtlamalar
Bir uygulama Android vitals'da açıklanan bazı kötü davranışlar sergiliyorsa sistem, kullanıcıdan bu uygulamanın sistem kaynaklarına erişimini kısıtlamasını ister.
Bir uygulamanın çok fazla kaynak kullandığını fark eden sisteme bu durumu bildirir: kullanıcıya uygulama işlemlerini kısıtlama seçeneği sunar. Bildirimi tetikleyebilecek davranışlar şunlardır:
- Aşırı sayıda uyanık kalma kilidi: Ekran açıkken bir saat boyunca 1 kısmi uyanık kalma kilidi tutuldu kapalı
- Aşırı düzeyde arka plan hizmeti: Uygulama, 26'nın altındaki API düzeylerini hedefliyorsa ve çok fazla arka plan hizmeti var.
Uygulanan kesin kısıtlamalar cihaz üreticisi tarafından belirlenir. Örneğin, örneğin, AOSP derlemelerinde, kısıtlanmış uygulamalar iş çalıştıramaz, alarm tetikleyemez veya (uygulama ön planda olduğu durumlar hariç)
Ağ etkinliği yayınlarını almayla ilgili kısıtlamalar
Uygulamalar şuraya kaydolursa CONNECTIVITY_ACTION
yayınlarını almaz:
bunları manifest biçiminde ve bu yayına bağımlı süreçlerde alabilirler.
başlamaz. Bu durum, ağı dinlemek isteyen uygulamalar için sorun teşkil edebilir.
Cihaz bir ağa bağlandığında bu cihaz üzerinde değişiklik yapabilir veya toplu ağ etkinlikleri gerçekleştirebilir
sınırsız ağ. Bu kısıtlamayı aşmak için şimdiden birçok çözüm
var olmakla birlikte, doğru çerçeveyi seçmek ne
istediğiniz performansı gösterir.
Sayaçsız bağlantılardaki işi planlayın
WorkRequest
oluştururken NetworkType.UNMETERED
Constraint
ekleyin.
fun scheduleWork(context: Context) {
val workManager = WorkManager.getInstance(context)
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.build()
)
.build()
workManager.enqueue(workRequest)
}
Çalışmanızın koşulları karşılandığında uygulamanız, çalışması için bir geri arama alır
belirtilen Worker
sınıfındaki doWork()
yöntemi.
Uygulama çalışırken ağ bağlantısını izleme
Çalışmakta olan uygulamalar, CONNECTIVITY_CHANGE
dinlemek için şuna sahip olabilir:
BroadcastReceiver
tarihinde kaydedildi. Ancak ConnectivityManager
API,
yalnızca belirtilen ağ olduğunda geri çağırma isteğinde bulunmak için daha sağlam bir yöntem sunar
karşılandığını gösterir.
NetworkRequest
nesneleri,
NetworkCapabilities
şartlarına tabidir. NetworkRequest
nesne oluşturuyorsunuz
NetworkRequest.Builder
sınıfıyla. registerNetworkCallback
ardından NetworkRequest
nesnesini sisteme iletir. Ağ
koşullar karşılandığında, uygulama
onAvailable()
yöntemi
ConnectivityManager.NetworkCallback
sınıf.
Uygulama, çıkış yapana veya çağrı yapana kadar geri çağırma almaya devam eder unregisterNetworkCallback().
Resim ve video yayınları almaya ilişkin kısıtlamalar
Uygulamalar ACTION_NEW_PICTURE veya ACTION_NEW_VIDEO yayınlar. Bu kısıtlama, müşterinin birkaç uygulamanın çalışması için ne zaman uyanması gerektiğini etkiler. yeni bir resim veya video işlemek için kullanılır.
Hangi içerik yetkililerinin çalışmayı tetiklediğini belirleyin
WorkerParameters
, uygulamanızın hangi içerikler hakkında yararlı bilgiler almasını sağlar
içerik yetkilileri ve URI'lar çalışmayı tetikledi:
List<Uri> getTriggeredContentUris()
Çalışmayı tetikleyen URI'ların listesini döndürür. Bu alan, şu durumlarda boş olur: veya hiçbir URI çalışmayı tetiklememiş olabilir (örneğin, çalışma, son tarih veya başka bir neden) ya da değiştirilen URI'ların sayısı 50.)
List<String> getTriggeredContentAuthorities()
Çalışmayı tetikleyen içerik yetkililerinin dize listesini döndürür. Eğer
döndürülen liste boş değil, almak için getTriggeredContentUris()
işlevini kullanın
hangi URI'ların değiştiğine ilişkin ayrıntılar.
Aşağıdaki örnek kod, CoroutineWorker.doWork()
yöntemini geçersiz kılar
ve işi tetikleyen içerik yetkililerini ve URI'ları kaydeder:
class MyWorker(
appContext: Context,
params: WorkerParameters
): CoroutineWorker(appContext, params)
override suspend fun doWork(): Result {
StringBuilder().apply {
append("Media content has changed:\n")
params.triggeredContentAuthorities
.takeIf { it.isNotEmpty() }
?.let { authorities ->
append("Authorities: ${authorities.joinToString(", ")}\n")
append(params.triggeredContentUris.joinToString("\n"))
} ?: append("(No content)")
Log.i(TAG, toString())
}
return Result.success()
}
}
Uygulamayı sistem kısıtlamaları altında test edin
Uygulamalarınızı düşük bellekli cihazlarda veya düşük bellekli koşullarda çalışacak şekilde optimize etme performansı ve kullanıcı deneyimini iyileştirebilir. Arka planda bağımlılıkları kaldırma hizmetler ve manifest kayıtlı örtülü yayın alıcıları, uygulamanızın bu tür cihazlarda daha iyi çalışır. Uygulamanızı en iyi şekilde yayınlanacak şekilde optimize etmeniz çoğu zaman kullanmayacağınızdan emin olmanız gerekir.
Bazı ek Android Debug Bridge (ADB) komutları, uygulamanızı test etmenize yardımcı olabilir aşağıdaki arka plan işlemlerinin devre dışı bırakıldığını görebilirsiniz:
Örtülü yayınların ve arka plan hizmetlerinin uygun olduğu koşulları simüle etmek için yoksa aşağıdaki komutu girin:
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
Örtülü yayınları ve arka plan hizmetlerini yeniden etkinleştirmek için aşağıdakileri girin komut:
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow
Uygulamanızı daha da optimize edin
Arka plan görevlerinizi optimize etmenin diğer iyi yolları için öğrenmek için Görev planlama API'leri için pil kullanımını optimize etme belgelerinden faydalanabilirsiniz.