Android Oreo Background Execution Limits

항상 백그라운드 프로세스를 실행해야합니다 최신 콘텐츠를 위해 서버와 동기화 애플리케이션의 데이터를 여전히 계산 중입니다

그러나 백그라운드 프로세스를 실행하면 운영 체제에 문제가 발생합니다 매우 중요한 배경 작업 요청을 한 20 개의 응용 프로그램이 있더라도 사용자가 사용중인 응용 프로그램은 부드럽게 실행해야합니다 Android Oreo는 이전과는 완전히 다른 접근 방식을 도입했습니다 사람들이 백그라운드 서비스 문제를 다시 생각하게합니다 일부 앱은 백그라운드에서 임의로 실행할 수 없습니다

여기에는 암시 적 브로드 캐스트를 통해 실행을 시작하는 응용 프로그램이 포함됩니다 백그라운드에서 여러 서비스를 여는 앱 영향을받는 API에 대한 간단한 개요를 살펴 보겠습니다 오리엔테이션 API도 영향을 받았지만 이제는 그것에 대해 이야기하지 않겠습니다 이 기사에 첨부 된 문서 링크를 통해 확인할 수 있습니다 자세한 내용과 관련된 위치 업데이트 이 변경 사항은 Android O 용으로 설계된 모든 애플리케이션에 적용됩니다

애플리케이션이 Android O 용으로 설계되지 않은 경우에도 사용자는 이러한 제한을 계속 사용할 수 있습니다 어쨌든 이러한 변화에주의를 기울여야합니다 백그라운드 동작의 첫 번째 변경은 서비스에 반영됩니다 백그라운드 호출로 서비스를 호출하면 IllegalStateException이 발생합니다 이 변경은 앱이 표시되거나 전경에있을 때 열리는 서비스에는 영향을 미치지 않습니다

바인딩 서비스에는 영향을 미치지 않습니다 다음과 같은 상황에서는 응용 프로그램이 포 그라운드에 존재하는 것으로 간주됩니다 앱이 프론트 데스크에서 백 오피스로 이동하면 서비스가 종료되기 전에 잠시 유예 기간이 있습니다 stopSelf 지시문을 실행 한 것처럼 서비스가 종료됩니다 이 변경 사항은 모든 서비스에 영향을 미칩니다 IntentService가 영향을 받습니까? 음, 네

PendingIntent 서비스가 영향을 받았습니까? 생성시 영향을받지 않지만 전송시 영향을받습니다 백그라운드에서 켜고 프론트 데스크로 푸시하고자하는 서비스조차도 영향을받습니다 좋은 소식은 서비스를 저장하는 여러 가지 방법이 있다는 것입니다 앱이 알람 시계 앱이 아니라면 그렇지 않으면 케이스의 90 %에서 최선의 선택 백그라운드 서비스를 예약 된 작업으로 바꾸십시오 백그라운드에서 더 이상 서비스를 열 수 없지만 그러나 작업 스케줄은 백그라운드에서 작업을 수행 할 수 있습니다

이를 위해서는 프레임 워크가 모든 스케줄 작업과 그 제약 사항을 고려해야합니다 그리고 어떤 스케줄 작업이 실행되어야하는지 결정하십시오 작업을 예약하는 데 사용할 수있는 몇 가지 솔루션이 있습니다 신청서의 필요에 따라 다릅니다 아래의 관련 텍스트를 첨부하여 다른 장단점을 설명했습니다

하지만 내 충고를 듣고 싶다면 Firebase JobDispatcher를 사용하는 것이 좋습니다 그리고 새로운 Job IntentService Job IntentService는 IntentService를 쉽게 대체 할 수 있습니다 다음은 임시 서비스 목록입니다 몇 가지 특별한 경우가 있습니다 여기에있는 앱이 일시적으로 화이트리스트에 추가됩니다

짧은 시간 안에 행동하는 것이 마치 프론트에서와 같다 서버 데이터가 변경 될 때 작업을 트리거하려는 경우 귀하의 서버 및 응용 프로그램에서 고려하십시오 Firebase 클라우드 메시징 배포 우선 순위가 높은 FCM 메시지를 사용하는 경우 이 메시지가 즉시 전송됩니다 그 시간에 시스템이 멈추더라도 동일합니다 또한 서비스 화이트리스트를 쉽게 사용할 수 있습니다 서비스를 열 수 있습니다

응용 프로그램이 포 그라운드에있는 것처럼 보이게하십시오 일반적인 우선 순위 FCM 메시지 인 경우 그런 다음 사용자가 장치 화면을 열면 메시지가 전달됩니다 또는 유휴 유지 관리 창에서 전달 하지만 시작 서비스 목록에 포함시킬 수는 없습니다 응용 프로그램이 높은 우선 순위 및 보통 우선 순위 정보를받는 경우 한 가지 방법은 서비스를 시작하는 것입니다 어떤 이유로 든 실패하면 그런 다음 백업 시나리오를 활성화하십시오

스케줄링 작업 켜기 사용자가 서비스와 상호 작용하거나 서비스를 모니터링하려는 경우 프론트 데스크 서비스를 만들 수 있습니다 프론트 데스크 서비스는 지속적인 화면 알림 기능을 제공합니다 이것은 서비스가 실행 중임을 사용자에게 알립니다 다양한 타이밍 어플리케이션과 네비게이션 어플리케이션이 일반적입니다 효율적인 콜 서비스 어플리케이션의 예 문제는 과거에는 "백그라운드에서 열린 프론트 데스크 서비스"가 더 이상 작동하지 않는다는 것입니다

새 API를 사용하여 프론트 데스크 서비스를 켜야합니다 첫 번째 단계는 새로운 startForegroundService 메소드를 사용하는 것입니다 이 메소드로 작성된 백그라운드 서비스는 즉시 포 그라운드로 푸시되어야합니다 서비스 내부에 알림을 작성하십시오 프런트 데스크 알림은 항상 중요도가 더 낮거나 높아야합니다 사용자가 볼 수 있도록 중간 중요성을 가질 수 없다

마지막 단계는 서비스가 startForeground 명령을 사용하도록하는 것입니다 그리고 당신이 방금 프론트 데스크에 자신을 밀어 넣은 통지 프론트 데스크 서비스를 켜려면 PendingIntent가 필요할 경우 PendingIntent의 새로운 getForegroundService 메소드를 사용할 수 있습니다 그런 다음 프론트 데스크 서비스로 홍보하는 것과 같은 방식으로 위의 방법 중 어느 것도 적합하지 않은 경우 숙제 연기를 고려할 수도 있습니다 앱이 프론트 데스크에 나타날 때까지 새로운 제약 조건 하에서 애플리케이션을 테스트하려면 또한 아래 링크를 adb 명령과 함께 연결했습니다 앱이 백그라운드에서 실행되도록 허용 앱의 배경 제한을 적용합니다

이제 암시 적 브로드 캐스트 수신기의 한계에 대해 이야기합니다 암시 적 브로드 캐스트를 수신하는 정적으로 결정된 수신기 이 브로드 캐스트를받지 못함 암시 적 브로드 캐스트에는 대상 기능 속성이 없습니다 정적 방송 수신기는 AndroidManifest에 정의되어 있습니다 Android Oreo 이전 암시 적 브로드 캐스트는 구성 요소를 수신하는 Manifest의 모든 것을 트리거합니다 연구 제한 사항으로 인해 메모리 지터가 발생합니다

이 시점에서 브로드 캐스트가 트리거되기 때문에 많은 응용 프로그램에서 많은 다른 구성 요소 정적 암시 적 브로드 캐스트 수신기를 다음과 같이 바꿀 수 있습니다 몇 가지 예외가 있으므로이 목록을 먼저 확인하십시오 방송이이 목록에있는 경우 영향을받지 않습니다 정상적으로 계속 작동합니다 이 목록에는 헤드폰 삽입을위한 지역 설정 변경 사항이 포함되어 있습니다

자세한 내용은 아래 첨부 된 링크를 참조하십시오 브로드 캐스트가이 예외 목록에없는 경우 작업을 사용하여 대체 할 수 있습니다 채용 정보는 이러한 조건 중 일부는 Android O에 추가되었습니다 특히, 컨텐트 프로 바이더 옵저버는 여러 작업을 트리거 할 수 있습니다 다양한 환경을 다루기 위해 예를 들어, 사용자가 전화에 새 사진을 저장하면 브로드 캐스트 설정이 준비되었을 때 응용 프로그램의 일부가 이미 작동중인 경우 다이나믹 브로드 캐스트 리시버로 전환 할 수 있습니다

즉, 브로드 캐스트 리시버 코드를 매니페스트 밖으로 옮기는 것입니다 그런 다음 런타임에 생성, 등록 또는 등록 취소 할 수 있습니다 내가 지금하고있는 것처럼 이러한 시나리오는 백그라운드 처리에 더 초점을 맞추었지만 그러나 프런트 엔드 사용자는 이러한 이점을 경험할 수 있습니다 이는 회피가 적고 충돌이 적음을 의미합니다 고가의 고속 하드웨어를 사용할 수없는 사용자 그것이 가져 오는 이익은 특히 인상적입니다 방금 여러 전략과 API 변경 사항에 대해 이야기했습니다

응용 프로그램이 영향을받는 경우 더 많은 것을 배우고 코드 예제를 배우기를 원한다면 첨부 문서보기