AlarmManager
생성 된 브로드 캐스트가있는 앱 위젯을 업데이트하는 데별로 행운이 없습니다. 여기에 내가 할 수있는 작업은 다음과 같습니다Android - AppWidgets, AlarmManager 및 AsyncTask
AlarmManager
초기화
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
AppWidgetProvider#onEnabled
에 나는 또한 단순히
AlarmManager
에 의해 발사 업데이트를 수신 방송 수신기를 정의합니다. 업데이트가 실행되면 코드는 네트워크 호출을 수행하는
AsyncTask
을 실행합니다.
AsyncTask
이 완료되면 (
onPostExecute
) 이전에 얻은
AppWidgetManager
인스턴스를 사용하여 위젯을 업데이트합니다. 실제로 로그에서 로그
"Process com.foo.myapp (pid 12345) has died"
을 볼 때까지
AlarmManager
은 다른 업데이트를 실행하지 않습니다.
알람을 다시 시작하는 검사가 필요합니까? 예를 들어 사용자가 위젯의 상위 앱에 액세스 할 때? 요청이 진행되는 도중에 내 앱이 죽으면 장기 실행 작업을 완료하고 위젯으로 돌아갈 수 있도록하려면 어떻게해야합니까?
좋아요, 제가 그걸 사면 - 이해가 안되는 것 : 왜 앱이 죽은 후에도 내 경보가 다시 발사되지 않습니다? 아니면 BroadcastReceiver가 앱으로 사망했기 때문입니까? 그런데도 앱을 실행해도 앱이 같은 방식으로 종료되면 어떻게 될까요? 내가 여기에 몇 가지 근본적인 지식을 잃어버린 것 같아요 – Bostone
또한 - 서비스를 시작하고 잠금을 획득 후 나는 장기 실행 작업을위한 스레드를 생성하거나 그냥 서비스의 일부로 실행해야합니까? – Bostone
AlarmManager가 다시 실행되지 않는 이유를 모르지만 알려진 문제점 (BroadcastReceiver에서 스레드 포크)을 수정하고 알 수없는 문제 (lobotomized alarm)를 해결할 수 있기를 바랍니다. IntentService는 백그라운드 스레드에서 onHandleIntent()를 자동으로 실행하므로 IntentService를 사용하는 경우에는 자신을 포크 할 필요가 없습니다. – CommonsWare