[android] AlarmManager가 여러 장치에서 작동하지 않음

내 앱은 AlarmManager를 사용하며 4 년 전부터 작동하고 있습니다. 그러나 일부 장치에서 실패하기 시작했습니다.

코드가 옳다고 확신합니다 (WakefulBroadcastReceiver를 사용하고 있으며 Doze가있는 장치에 대해 setExactAndAllowWhileIdle을 사용하고 있습니다) .Nexus 장치에서 완벽하게 작동하기 때문에 일부 제조업체 (Huawei, Xiaomi …)의 장치에서는 실패합니다.

예를 들어 화웨이 기기에는 앱을 종료하는 일종의 배터리 관리자가 있으며 앱이 종료되면 예약 된 알람이 취소됩니다. 따라서 Huawei 배터리 관리자에서 앱을 “보호됨”으로 설정하면 문제가 해결됩니다.

그러나 최근에 Xiaomi, Samsung (새로운 “Smart Manager”와 관련이있을 수 있습니까?)과 같은 더 많은 장치에서 작동하지 않는 것으로 나타났습니다.이 동작이 표준이되고있는 것 같습니다 : 백그라운드 앱을 종료하는 것입니다.

누구든지 그것에 대해 알고 있습니까? 경보가 울리도록 할 방법이 있습니까?

편집 :이 문제는 다른 제조업체에서 추가 한 “배터리 세이버”로 인해 발생합니다. 자세한 정보 : https://dontkillmyapp.com/



답변

나는 이미 몇 주 동안 그것을 해결하려고 노력하고 있습니다. 나는 아무것도 찾지 못했다. 화웨이는 잠시 후 모든 경보를 죽입니다. 배터리 세이버의 보호 된 앱에 앱을 넣으면 도움이되지 않습니다. 그러나 알람, 시계 또는 달력과 같은 단어를 포함하도록 앱의 패키지 이름을 변경하면 다른 장치와 마찬가지로 절대적으로 정상적으로 작동합니다. Google이이 쓰레기에 대한 인증을 제공하는 방법을 이해할 수 없습니다. OEM은 이러한 방식으로 핵심 플랫폼을 수정해서는 안된다고 생각합니다. 나는 그들이 사용자가 그것을 사용하지 않을 때 얼마 후에 앱을 죽이는 자체 배터리 세이버를 가지고 있음을 이해합니다. 그러나 이것은 보호 된 앱에 대한 경보이기도합니다.

정확한 타이밍 알람에 대한 setAlarmClock ()도 도움이됩니다. 그러나 위젯 업데이트와 같은 생각에는 이것을 사용할 수 없습니다.

업데이트 : 패키지 이름 키워드에 의한 보호는 현재 Huawei 장치에서 이미 작동하지 않으며 2017 년에도 마찬가지였습니다.


답변

문제는 Smart Manager입니다. 삼성에는 때때로 특정 앱이 백그라운드에서 실행되지 않도록하는 배터리 관리자가 있습니다. 앱으로 돌아갈 때 “재개”를 시도했지만 응용 프로그램을 완전히 비활성화하거나 5 분마다 재개 할 수 있습니다 (삼성에 따라 다름).

이것은 삼성 관리자가 없기 때문에 안드로이드의 재고 버전에서 작동합니다. SM을 활성화하는 몇 가지 기능이있는 Android의 사용자 지정 버전을 설치할 수도 있습니다 (ROM에 따라 다름).


답변

대부분의 최신 Android 기기에는 자동으로 배터리 절약 방법을 알아 내려고 시도하는 앱 또는 메커니즘이 함께 제공되며 그 결과 특정 타사 앱이 종료 될 수 있습니다. 이로 인해 예약 된 작업 및 작업이 제거 될 수 있습니다 (예 : 알람이 울리지 않음, 푸시 알림이 작동하지 않음 등). 대부분의 경우 이것은 Android의 배터리 절약 메커니즘과 완전히 독립적으로 발생합니다. 제 경우에는 일부 장치 모델을 감지 할 때 더 많은 배터리를 최적화 할 수 없었고 사용자를 시작 관리자로 리디렉션하여 내 애플리케이션을 허용 목록에 추가했습니다.

모든 모델에 대해이 링크에서 https://android-arsenal.com/details/1/6771 을 호출해야하는 인 텐트를 찾았습니다.


답변

5.0 미만 장치에는 AlarmManager를 사용하고 5.0 이상 장치에는 JobScheduler를 사용하십시오. JobScheduler가 제조업체의 헛소리에 영향을받지 않을 것이라고 확신 할 수는 없지만 Android가 사람들을 AlarmManager에서 JobScheduler로 옮기려고한다는 점을 감안할 때 나에게는 훨씬 덜 보일 것입니다.

수정 : Google은 WorkManager 라는이 문제에 대한 자사 솔루션을 제공했습니다 . 여러 스케줄링 프레임 워크를 추상화하고 장치에 가장 적합한 프레임 워크를 사용합니다.


답변

알람 을 설정하는 앱도 있습니다. 해결책은 api> = 21에서 AlarmManager.setAlarmClock () 을 사용하는 것입니다 . 이것은 잠자기 afaik의 영향을받지 않으며 시스템 트레이에 알람 시계 아이콘을 추가하는 추가 보너스가 있습니다.


답변

요즘 대부분의 새 전화기에는 설명했던 것과 동일한 기능을 수행하는 일종의 배터리 / 절전 관리자가 번들로 제공됩니다. duboosters와 clean masters를 세지 않습니다.

제대로 작동하려면 앱 / 플레이 스토어 목록에이 앱을 배터리 관리자 앱의 예외에 넣어야한다는 면책 조항이나 FAQ를 넣어야한다고 생각합니다.


답변

나는 얼마 전에 AlarmManager 사용을 중단했습니다 … 더 좋고 안정적인 대안

  1. 서비스 생성
  2. BOOT_COMPLETED에 대한 BroadcastReceiver 등록
  3. 수신자로부터 서비스를 시작하십시오.
  4. X 분마다 자체적으로 반복되는 서비스 내에서 새 핸들러를 시작합니다 ( Android-postDelayed () 호출을 사용하여 주기적으로 메서드 실행 ).
  5. 작업을 실행할 시간이되었는지 확인하십시오. now-실행 시간> 0 ( Java에서 두 날짜 간의 차이 기간을 찾는 방법은 무엇입니까? )
  6. 그렇다면 .. 작업을 실행하고 핸들러를 중지합니다.

그래 .. 고통 스럽지만 일은 끝났어.