Arka planda çalışmayla ilgili sistem kısıtlamaları

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:

  1. Aşırı sayıda uyanık kalma kilidi: Ekran açıkken bir saat boyunca 1 kısmi uyanık kalma kilidi tutuldu kapalı
  2. 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.