2013-08-20 2 views
1

서비스에 반복 알람을 설정했으며 호출 된 서비스 내에서 알람을 재설정하는 것이 가장 편리하다고 판단했습니다. 그 이유는 서비스에 이미 사용자 정의 일정 (시간 범위) 내에 있는지 확인하는 코드가 있기 때문입니다. 시간 범위를 벗어나면 사용자가 선택한 이후 시간에 알람이 시작되도록 재설정됩니다. 어쩌면 나는이 잘못에 접근하고있다. 그러나 나는이 질문을 거기 밖으로두고 당신이 생각하는 것을 보게 될 것이다.Android : 호출 된 서비스 내에서 반복되는 AlarmManager 재설정

//Activity 
Calendar cal = Calendar.getInstance(); 
Intent intent = new Intent(getApplicationContext(), MyService.class); 
intent.setData(Uri.parse("MyService://identifier")); 
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
      intervalInMins*60000, pIntent); 

서비스는 이런 일이 있습니다 :

액티비티는 반복 알람을 생성하여 서비스를 개막

//Service 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Uri Action = intent.getData(); 
    try { 
     if (Action.equals(Uri.parse("MyService://identifier"))) { 
      //Simplifying the code here: CalculatedOffset is determined from the current time 
      //and scheduled start time. intervalInMins is read from settings. 
      if (!WithinSchedule()) { 
       Calendar cal = Calendar.getInstance(); 
       PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0); 
       AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + CalculatedOffset, 
         intervalInMins*60000, pIntent); 
      } 
     } 
    } catch (NullPointerException np) { 
     np.printStackTrace(); 
    } 
    return Service.START_REDELIVER_INTENT; 
} 

나는 반복을 재설정 할 의도를 다시 사용에 기대했다 경보. 이 새로운 코드를 사용하면 시작 시간이되면 여러 개의 알람이 연속적으로 연속적으로 쌓이는 것을 볼 수 있습니다. 그것은 그렇게 spaz해서는 안됩니다,하지만 정기적 인 간격으로 시작해야 스케줄링 재설정 전에 않았다. 나는 그것을 디버거에서 잡아야하지만 정확한 조건을 아직 결정할 수 없었다. 알람에 대한 나의 이해가 완전히 여기에서 벗어난 것입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

부록 : 이것의 주름은 RootTools를 사용하여 Android 4.2의 비행기 모드를 해결하기 위해 수퍼 유저 권한을 얻는 것입니다. 이것은 스케줄링 이전에는 문제가 아니었지만, 알람이 겹쳐지는 동안 su가 오랫동안 블로킹하고 있는지 의심 스럽습니다.

+0

반복 알람을 대체 할 때 PendingIntent를 만들 때 PendingIntent.FLAG_CANCEL_CURRENT를 사용해야합니까? 나는 0을 계속 사용하고있다. – pmont

답변

0

경보를 수신 한 서비스 내부의 의도를 다시 사용하면 작동합니다. 반복 알람을 사용하지 않고 서비스가 호출 될 때마다 다시 켜지는 단일 샷 알람으로 전환했습니다. 불행히도 이것은 알람 스태킹 문제를 해결하지 못했습니다. 범인은 확실히 차단하고 있습니다. RootTools 또는 su 자체 일 수 있습니다. 라이브러리를 2.6에서 3.x로 업데이트하고 차이가 있는지 확인해야합니다.