Procesy w tle mogą pochłaniać dużo pamięci i baterii. Na przykład niejawna transmisja może uruchomić wiele procesów w tle, które zarejestrowały ich wysłuchać, nawet jeśli procesy te mogą nie przynosić rezultatów. Może mieć mają duży wpływ na wydajność urządzenia i wrażenia użytkownika.
Aby uniknąć ograniczeń systemu, upewnij się, że używasz interfejsu API odpowiedniego dla Twojej w tle. Dokumentacja omówienia zadań w tle pomoże Ci wybrać interfejs API odpowiedni do Twoich potrzeb.
Ograniczenia inicjowane przez użytkownika
Jeśli aplikacja wykazuje pewne działania opisane w Android Vitals, system prosi użytkownika o ograniczenie dostępu aplikacji do zasobów systemowych.
Jeśli system zauważy, że aplikacja zużywa zbyt dużo zasobów, i pozwala mu ograniczyć działania w aplikacji. Działania, które mogą spowodować wyświetlenie powiadomienia, to między innymi:
- Nadmierne blokady uśpienia: jedna częściowa blokada uśpienia zatrzymana na godzinę, gdy ekran jest wyłączony. wyłączona
- Nadmierne usługi w tle: jeśli aplikacja jest kierowana na interfejs API na poziomie niższym niż 26. i ma nadmierną liczbę usług w tle
Dokładne ograniczenia są określane przez producenta urządzenia. Dla: na przykład w kompilacjach AOSP aplikacje z ograniczonym dostępem nie mogą uruchamiać zadań, uruchamiać alarmów ani używać z wyjątkiem sytuacji, gdy aplikacja działa na pierwszym planie.
Ograniczenia odbierania komunikatów o aktywności w sieci
Aplikacje nie otrzymują transmisji CONNECTIVITY_ACTION, jeśli są zarejestrowane w
znajdą je w pliku manifestu i w procesach zależnych od tej transmisji.
nie chce się uruchomić. Może to stanowić problem w przypadku aplikacji, które chcą nasłuchiwać połączenia z siecią
zmienia lub wykonuje masowe działania sieciowe, gdy urządzenie łączy się
bez pomiaru. Kilka rozwiązań, które pomogą ominąć to ograniczenie
istnieje w platformie Androida, ale wybór tej metody zależy od tego,
które aplikacja ma osiągnąć.
Planowanie pracy w przypadku połączeń bez pomiaru użycia danych
Podczas tworzenia elementu WorkRequest dodaj NetworkType.UNMETERED Constraint.
fun scheduleWork(context: Context) {
    val workManager = WorkManager.getInstance(context)
    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
       .setConstraints(
           Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .build()
           )
       .build()
    workManager.enqueue(workRequest)
}
Po spełnieniu warunków dotyczących pracy aplikacja otrzymuje wywołanie zwrotne w celu jej uruchomienia
metody doWork() w określonej klasie Worker.
Monitorowanie połączeń sieciowych podczas działania aplikacji
Włączone aplikacje mogą nadal nasłuchiwać przez CONNECTIVITY_CHANGE przy użyciu
zarejestrowane BroadcastReceiver. Interfejs ConnectivityManager API
udostępnia bardziej niezawodną metodę żądania wywołania zwrotnego tylko w przypadku określonej sieci
są spełnione warunki.
Obiekty NetworkRequest definiują parametry wywołania zwrotnego sieci w
warunki usługi NetworkCapabilities. Tworzysz obiekty (NetworkRequest)
z zajęciami NetworkRequest.Builder. registerNetworkCallback
a następnie przekazuje obiekt NetworkRequest do systemu. Gdy sieć
są spełnione, aplikacja otrzymuje wywołanie zwrotne w celu wykonania
onAvailable() zdefiniowanej w
ConnectivityManager.NetworkCallback zajęcia.
Aplikacja będzie otrzymywać wywołania zwrotne, dopóki nie zostanie zamknięta lub nie nawiąże połączenia. unregisterNetworkCallback().
Ograniczenia dotyczące odbierania obrazów i transmisji wideo
Aplikacje nie mogą wysyłać ani odbierać wiadomości ACTION_NEW_PICTURE lub Transmisje ACTION_NEW_VIDEO. To ograniczenie pozwala złagodzić wydajność i wygodę użytkownika wpływają na to, czy kilka aplikacji musi się wybudzić, w celu przetworzenia nowego zdjęcia lub filmu.
Jak ustalić, które organizacje zajmujące się tworzeniem treści uruchomiły pracę
WorkerParameters umożliwia aplikacji otrzymywanie przydatnych informacji o tym,
urzędy treści i identyfikatory URI uruchomiły pracę:
List<Uri> getTriggeredContentUris()
Zwraca listę identyfikatorów URI, które spowodowały uruchomienie zadania. To pole jest puste, jeśli: albo żaden identyfikator URI nie spowodował wywołania utworu (na przykład zadanie zostało aktywowane ze względu na termin lub inna przyczyna) bądź liczba zmienionych identyfikatorów URI jest większa niż 50)
List<String> getTriggeredContentAuthorities()
Zwraca listę ciągów znaków towarowych, które uruchomiły pracę. Jeśli
zwrócona lista nie jest pusta, użyj polecenia getTriggeredContentUris(), aby pobrać
szczegółowe informacje o tym, które identyfikatory URI uległy zmianie.
Ten przykładowy kod zastępuje metodę CoroutineWorker.doWork()
i rejestruje urzędy certyfikacji oraz identyfikatory URI, które spowodowały uruchomienie zadania:
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()
    }
}
Testowanie aplikacji z ograniczeniami systemu
optymalizować aplikacje pod kątem działania na urządzeniach z małą ilością pamięci lub ich małą ilością pamięci; może zwiększyć wydajność i wygodę użytkowników. Usuwam zależności w tle i niejawne odbiorniki zarejestrowane w pliku manifestu mogą pomóc działają lepiej na takich urządzeniach. Zalecamy zoptymalizowanie działania aplikacji pod kątem bez wykorzystywania tych procesów w tle.
Kilka dodatkowych poleceń Android Debug Bridge (ADB), które mogą pomóc w testowaniu aplikacji. działanie przy wyłączonych procesach w tle:
- Aby symulować warunki, w których występują niejawne transmisje i usługi w tle niedostępny, wpisz następujące polecenie: - $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
- Aby ponownie włączyć niejawne komunikaty i usługi w tle, wpisz: polecenie: - $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow
Dalsza optymalizacja aplikacji
Inne dobre sposoby optymalizacji zadań w tle zachowania, patrz Optymalizacja wykorzystania baterii przez interfejsy API do planowania zadań dokumentacji.
