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.