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 ()
.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
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
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
RUN_IN_BACKGROUND ignore Aby ponownie włączyć niejawne komunikaty i usługi w tle, wpisz: polecenie:
$ adb shell cmd appops set
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.