2012-01-16 3 views
8

동일한 pendingIntent를 사용하여 서로 다른 intentId를 사용하여 여러 알람을 설정했습니다. 알람이 작동 중입니다. 이제 특정 알람을 취소하고 싶습니다. cancel() 메서드를 사용하면 모든 경고가 취소됩니다. 나는 단지 특정 하나만 삭제되기를 원한다. 또한 사용자는 두 번째 또는 세 번째 출시 중에도이 경보를 취소 할 수 있어야합니다. 내가 두 번째로 시작할 때, 나는 동일한 pendingIntent 객체를 가지지 않을 것이다. pendingIntent 객체를 유지해야합니까? 그렇다면 어떻게? 어떻게 여러 알람에서 하나의 알람을 취소합니까?여러 알람이있을 때 하나의 알람 취소

+0

동일한 계류중인 의도를 가진 알람 세트 중 하나의 알람을 취소하는 방법을 모르겠습니다. 그러나 특정 지속 시간 (공유 환경 설정, 파일, sqlite 등)을 사용하여 특정 경보 시간을 취소 된 것으로 표시 할 수 있으며 경보 의도를 통해 호출 된 코드에서 저장된 정보를 평가하여 경보가 발생했는지 여부를 결정할 수 있습니다 취소 된. 또는 모든 알람을 취소하고 나중에 하나를 제외한 모든 알람을 설정할 수 있습니다 (여전히 모든 시간을 알고있는 경우). BTW, 원래 보류 의도가 필요하지 않습니다, 당신은 새로운 것을 만들 수 있습니다. – Stefan

답변

8

당신은 이런 식으로 작업을 수행 할 수

그리고 당신이 할 수 취소 : 그리고 당신은이 알람을 취소 동일한 Pending Intent를 사용하여 동일한 고유 ID를 사용하여이를 취소하십시오. 에 대한 자세한 내용은 방금에 StackOverflow 또는 Google을 사용할 수 있습니다 얻기 위해

am.cancel(pi); 

는 지금은 this answer 당신을 위해 할 것이라 생각합니다. :)

+0

unique_id를 알람 시간 (밀리 초)으로 설정하면 고유 한 것으로 보장 할 수 있습니다. 그러므로 당신은 그것을 쉽게 취소 할 수 있습니다. 나는이 작품을 확인했다. calendar 메소드는 calendar.getTimeInMillis()입니다. – bschwagg

3

설명과 함께 해킹의 일종입니다.

먼저 보류중인 의도에 대해 고유 한 의도를 만들어야합니다. 이를 위해 응용 프로그램의 의도에 대한 사용자 지정 데이터 필드를 만들 수 있습니다. 나는 다음과 같은 방법으로이 작업을 수행 :

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
       String.valueOf(intentId)); 
intent.setData(data); 

귀하의 경우 intentId에서 당신에게 의도의 고유 식별자 될 것입니다.

그런 다음 평소와 같이 alarmManager 알림을 만듭니다. 알람을 취소하려면 다음 단계를 수행해야합니다. 처음에는 이전 코드 샘플 에서처럼 의도를 만들어야합니다. 그런 다음이 의도에 따라 보류중인 인 텐트를 만듭니다 (알람에 대해 동일한 보류 인 텐트를 만들 수도 있습니다). 당신이 requestCode

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0); 

의 자리에 unique ID을 통과 할 수 보류 의도에서

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
      String.valueOf(intentId)); 
intent.setData(data); 


PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context, 0, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.cancel(pendingIntent);