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<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.