1

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은 다른 업데이트를 실행하지 않습니다.

알람을 다시 시작하는 검사가 필요합니까? 예를 들어 사용자가 위젯의 상위 앱에 액세스 할 때? 요청이 진행되는 도중에 내 앱이 죽으면 장기 실행 작업을 완료하고 위젯으로 돌아갈 수 있도록하려면 어떻게해야합니까?

답변

4

업데이트가 실행되면 코드가 실행되어 네트워크 호출을하는 AsyncTask가 실행됩니다.

BroadcastReceiver 안에 있으면 작동하지 않습니다. BroadcastReceiver에서 안전하게 스레드를 포크 할 수 없으며 AsyncTask 스레드는 스레드가 비동기 적으로 작업을 수행하도록 효과적으로 포크합니다.

대신 장기 실행 작업을 service started from the alarmBroadcastReceiver으로 위임해야합니다.

+0

좋아요, 제가 그걸 사면 - 이해가 안되는 것 : 왜 앱이 죽은 후에도 내 경보가 다시 발사되지 않습니다? 아니면 BroadcastReceiver가 앱으로 사망했기 때문입니까? 그런데도 앱을 실행해도 앱이 같은 방식으로 종료되면 어떻게 될까요? 내가 여기에 몇 가지 근본적인 지식을 잃어버린 것 같아요 – Bostone

+0

또한 - 서비스를 시작하고 잠금을 획득 후 나는 장기 실행 작업을위한 스레드를 생성하거나 그냥 서비스의 일부로 실행해야합니까? – Bostone

+1

AlarmManager가 다시 실행되지 않는 이유를 모르지만 알려진 문제점 (BroadcastReceiver에서 스레드 포크)을 수정하고 알 수없는 문제 (lobotomized alarm)를 해결할 수 있기를 바랍니다. IntentService는 백그라운드 스레드에서 onHandleIntent()를 자동으로 실행하므로 IntentService를 사용하는 경우에는 자신을 포크 할 필요가 없습니다. – CommonsWare