2012-04-26 2 views
2

AlarmManager를 무기한으로 지속되도록 (또는 시스템 재부팅 때까지 또는 작업 킬러가 현실적으로 그것을 지울 때까지) AlarmManager를 선언하고 초기화해야하는 적절한 컨텍스트는 무엇입니까? 또한 전체 애플리케이션의 범위에 걸쳐 알람을 변경할 수 있습니다.Android AlarmManager는 오랜 시간 후에 실행을 중지합니다.

AlarmManager를 사용하는 이유는 항상 서비스를 실행해야하는 필요성을 해결하기 위해서입니다. 그러나 이러한 위업을 달성하기 위해 AlarmManager가 어디에 생성 되었습니까? 나는 알람 객체가 사라질 것이고 결국 알람이 꺼지기 때문에 서비스가 해제되거나 파괴 될 수 없다고 상상할 것입니다.

다른 질문지의 AlarmManager 예제 아이디어가 마음에 들었습니다. MyAlarm 클래스는 알람의 onReceive에 대한 BroadcastReceiver의 확장으로 만들어지며 AlarmManager는이 클래스의 생성자에서 초기화됩니다. 그러나 MyAlarm 인스턴스가 여러 컨텍스트에서 필요하면이 구현은 어떻게 작동합니까? 여러 Activity 객체 전체의 이벤트 핸들러와 같은 여러 위젯의 이벤트 핸들러에서. 작업자 서비스 내에서. 이 모든 것은 알람을 비활성화하거나 활성화해야 할 수 있습니다. 내 생각 엔 알람을 처리해야하는 모든 곳에서 로컬 인스턴스를 만들고 pendingIntent가 모든 인스턴스에서 동일하기 때문에 사실상 가상 "싱글 톤"으로 작업하게 될 것입니다.

이것은 8시 12 분에 발생할 수있는 알람 관리자의 "가비지 수집"을 테스트하는 방법을 모르기 때문에이 시점에서만 개념적입니다. 몇 시간 후에 내 경보가 무작위로 발사를 중지합니다. 내 목표는 전화가 재부팅되지 않고 내 작업이 수동으로 사용자에 의해 종료되지 않아 알람이 계속 울리도록하는 것입니다. 감사합니다

답변

0

안드로이드에서는 OS가 자동으로 사용하지 않는 서비스를 닫습니다. 많은 앱과 특히 위젯이이 문제로 고생합니다. 서비스 자체가 닫히지 않도록하는 확실한 방법이 있는지 나는 모른다. 때로는 무언가를함으로써 시스템을 오래 쓸 수 없으므로 시스템이 쓸데없는 일이라고 생각하지 않습니다.

예, 모두 동일한 보류 의도를 사용하므로 여러 개의 핸들러가 연결된 하나의 서비스 만 실행할 수 있습니다. 이는 OS를 설정하는 방식의 이점입니다. 단일 서비스 시작시 모든 위젯을 서명으로 업데이트 할 수 있으며 해당 서비스는 위젯에서 모든 핸들러를 수신 할 수도 있습니다.

+0

죄송합니다. 내 목표는 AlarmManager를 사용하여 내 서비스가 계속 실행될 필요가 없도록하는 것이 었습니다. 경보는 사실 서비스를 시작하고 서비스는 작업이 끝난 후 종료됩니다. 진짜 질문은, 주어진 pendingIntent에 대해이 AlarmManager 인스턴스를 어디에서 초기화 할 것인가? 원래 선언 된 서비스가 더 이상 실행되지 않는다고하더라도, 영원히 계속 실행되는 것입니다. – gauglerb

+0

서비스는 지속되는 백그라운드 프로세스이므로 청취자를 계속 열어 둘 수 있습니다. AlarmManager를 초기화 할 수 없으므로 서비스에서 초기화하고 해당 서비스가 계속 실행되도록 "영원히 실행됩니다". 내가 말했듯이 당신은 가끔씩 뭔가를함으로써 그것을 유지할 수 있다고 말했듯이 OS는 그것이 죽은 과정이라고 생각하지 않습니다. 사람들이 화면 깨우기 기능을 사용하면 사용자가 휴대 전화를 깨울 때마다 무언가를합니다. OS가 서비스를 죽이지 않는지 확인하기에 충분하기 때문에 대개 시도해 볼 것입니다. –

0

그러나이 위업을 수행하려면 AlarmManager가 어디에 생성 되었습니까?

AlarmManager은 시스템 서비스입니다. 그것은 운영 체제에 의해 "생성"됩니다.

내가이 그것을하지 않을 다음 알람 객체가 결국, 그것은 멀리 갈 것 때문에 파괴/해제되는 서비스에 생성 할 수 없으며, 알람이 firing-을 중지 할 상상?

AlarmManager은 시스템 서비스입니다. "경보"는 운영 체제에 있습니다.

내 생각에 알람을 처리해야하는 모든 곳에서 로컬 인스턴스를 만들고 모든 인스턴스에 대해 pendingIntent가 동일하기 때문에 사실상 가상 "싱글 톤"으로 작업하게됩니다.

수정.

+0

OS에서 생성 한 시스템 서비스입니다. 이 덕분에 개념화하는 데 도움이됩니다. 감사합니다! 따라서 앱이 강제 종료되거나, 작업이 종료되거나, 알람이 프로그래밍 방식으로 취소되거나, 기기가 재부팅되는 경우를 제외하고는 반복 알람 (pendingIntent)이 예약되면 알람이 무기한 중지되어야합니다. setRepeating (PI)가 어디에서 호출되었는지는 중요하지 않습니다. PI는 정상적인 상황에서이 알람을 영원히 지속시키기 위해 정적 오브젝트 또는 특별한 것이어야합니다. 감사합니다 – gauglerb

+1

@ user1359312 : * 알람을 발생시킬 수있는 유일한 다른 시나리오는 앱을 업그레이드 할 때입니다. 그러나 앱을 재현 할 수는 없습니다. 그렇지 않으면 목록이 상당히 완성 된 것처럼 보입니다. "setRepeating (PI)이 어디에서 호출되는지는 중요하지 않습니다." - 맞아. "PI는 정상적인 상황에서이 알람을 영원히 지속시키기 위해 정적 오브젝트 또는 특별한 것이어야합니다." -- 아니. – CommonsWare

관련 문제