Ograniczenia systemowe dotyczące działania w tle

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:

  1. Nadmierne blokady uśpienia: jedna częściowa blokada uśpienia zatrzymana na godzinę, gdy ekran jest wyłączony. wyłączona
  2. 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 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 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 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.