4

Android의 AlarmManagers는 전화가 끊어지면 등록 된 모든 알람을 잃습니다.BroadcastReceivers는 BOOT_COMPLETED를 청취 할 때 어떤 컨텍스트를 수신합니까?

나는 안드로이드 부팅시 실행하는 데 다음과 같은 방송 수신기를 사용

방송 수신기의 onReceive가 시스템 부팅시 실행됩니다
public class AlarmBootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
      Cursor alarmCursor = MainActivity.dbHelper.loadAlarms(); 
      // Iterate through every stored alarm and set those alarms. 
      // .... 
      alarmCursor.close(); 
     } 
    } 
} 
  • , 어떤 컨텍스트 매개 변수는 메소드에 주어진? 컨텍스트에서 설정 한 알람을 취소하는 컨텍스트가 필요하기 때문에 컨텍스트를 알아야합니다.

  • 시스템 부팅시 MainActivity가 초기화되지 않았기 때문에 MainActivity.dbHelper.loadAlarms() 호출이 안전하지 않다고 가정합니다. 또는 dbhelper 및 loadAlarms()가 모두 초기화되고 정적으로 선언 되었기 때문에 안전합니까?

+0

컨텍스트 유형이 중요하지 않습니다. 더 중요한 것은 스스로 처리해서는 안됩니다. 프레임 워크 나 Google 도서관에는 여러 가지 해결책이 있습니다. 첫 번째 옵션 : Job sheduler api. 두 번째 옵션 : GcmNetworkMamager를 사용하여 예약 된 작업. 기타 ... –

답변

1

에서 알람을 설정하는 방법? 문맥이 문맥에서 놓는 취소하기 위하여 문맥을 필요로하기 때문에 나는 맥락을 알아야한다.

이 경우 글로벌 신청 ContextonReceive()에 있습니다. 그러나 이것은 부적절합니다. 당신은 알 필요가 없습니다.

알람을 나중에 취소하려면 PendingIntent을 만들고 Context을 사용하면됩니다. 알람은 특정 Context에 연결되지 않으며 특정 응용 프로그램에만 연결됩니다. MainActivity 시스템 부팅에서 초기화되지 않기 때문에

내가 MainActivity.dbHelper.loadAlarms에 전화를 (가정입니다)은 안전하지 입니다. 또는 dbhelper 및 loadAlarms()가 모두 초기화되고 이 static으로 선언 되었기 때문에 이 안전합니까? dbHelper 만약

실제로 static하고 (하지onCreate()에서) 인스턴스 생성시 초기화,이 호출은 괜찮습니다. 일반적으로 Activity이 올바르게 설정되었다고 가정하면 어리석은 일을하기 쉽기 때문에 액티비티에 대한 정적 메서드 호출은 싫은 일입니다. 이러한 정적 메서드를 Activity이 아닌 일반 유틸리티 클래스로 이동하고 static 메서드 만 포함하는 것이 좋습니다. 이것은 의심 스러울 것입니다.

0

그것은 당신의 브로드 캐스트 리시버가 수신 Context 어떤 유형의 문제가되지 않는다 (어떤 경우에는, 그 ApplicationContext) 때문에 : 당신은 Activity과 연관된 DBHelper를 사용해서는 안 1). 대신 싱글 톤으로 만들고 앱 전체에서 사용하십시오. 2) AlarmManagerService을 사용하여 설정해야합니다. 방송 수신기의 onReceive가 시스템 부팅시 트리거가 어떤 컨텍스트 매개 변수는 메소드에 주어진 때, 그것의 좋은 아이디어는 당신의 onReceive()에서 서비스를 호출하고 서비스

+0

오, 그건 의미가 있습니다.DBHelper는 정적 메소드를 가진 정적 클래스 여야합니까? 아니면 싱글 톤으로 구현하는 것과 다른가? DBHelper를 초기화 가능하게 만드는 것은 어딘가에서 변수로 유지해야한다는 것을 의미하므로 확신 할 수 없습니다. 그래서 다른 액티비티는 그 구현이 쓰레드에 안전하다고 가정 할 때 그 싱글 톤을 인스턴스화 할 것인가? – SMP

+0

싱글 톤은 정적과 다릅니다. 간단한 Google 검색은 다음과 같이 유도합니다. https://gist.github.com/Akayh/5566992 –

+0

싱글 톤을 사용하지 마십시오. –

관련 문제