2017-02-08 11 views
4

내 애완 동물 프로젝트 중 하나는 사용자가 정의한 특정 날짜에 대한 알림을 표시합니다. 나는 오늘 알림이 표시되어야 하는지를 결정하기 위해 앱을 시작하는 일일 알람을 예약하기 위해Android에서 매일 알람을 테스트하는 방법은 무엇입니까?

AlarmManger.setRepeating(AlarmManager.RTC_WAKEUP, millis, AlarmManager.INTERVAL_DAY, pendingIntent) 

을 사용합니다.

문제는 일일 알람이 작동하지 않는 경우가 있다는 것입니다. 나는 그 이유 (장치 재부팅, 날짜/시간 변경, 응용 프로그램 재설치, 도즈 모드)에 대한 여러 가지 이유를 알고 있으며 아직 찾지 못한 몇 가지 이유가 있다고 확신합니다 (아이디어는 환영합니다!).

제 질문은 가능한 모든 위험으로부터 경보를 올바르게 테스트하는 방법입니다. 계측 테스트가 여기에 맞습니까?

답변

1

제 질문은 가능한 모든 위험 요소에 대해 적절한 방법으로 알람을 테스트하는 것입니다. 계측 테스트는 여기에 맞습니까?

AlarmManager은 Android OS의 일부이므로 잘 테스트되었으므로 테스트를 위해 계측 또는 단위 테스트를 수행 할 필요가 없습니다. 알람으로 호출되는 서비스를 테스트 할 수 있지만 알람이 올바르게 설정되었는지 테스트 할 필요가 없습니다.

알람이 삭제되거나 유효하지 않게되거나 무시되는 경우가 있습니다. 당신은 이미 그들에게 전화 :

  • 재부팅
  • 에 졸다 모드에 대한 시간 변경

지금 당신은 무엇을 할 수 있는지, 재구성하는 시스템 알림 (OS 방송)를 사용하는 것입니다 경보.

On reboot
경보 장치 종료에 떨어졌다, 그래서 재부팅 다시 설정

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
      // set repeating alarm 
      MyAlarmMangerSupport.set(context); 
     } 
    } 
} 

On time change
시간 변경에 동일한 절차 : 내가 거기에 생각

public class TimeChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (Intent.ACTION_TIME_CHANGED.equals(action) || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { 
      // cancel previous alarm and set a new one 
      MyAlarmMangerSupport.cancelAndSet(context); 
     } 
    } 
} 

On doze mode
보여줄 필요가 없습니다 irrelev 개미 장치가 입력되면 알림 the doze mode 어쨌든 장치가 도우미 상태에 있더라도 경고를 발령하는 방법이 있습니다.

doze 모드는 API 레벨 23부터 시작하는 새로운 기능입니다.

  1. 사용자는 앱에 대해 whitelist your app and disable Battery Optimization이어야합니다.싱글 샷 경보 당신이 당신의 경보 수신기에서 다시 설정해야로이 :

    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, period, pendingIntent); 
    

    중요 :

  2. 사용 setExactAndAllowWhileIdle 방법은 23+ 안드로이드 수준의 장치에 대한 알람을 설정합니다 :

    public class AlarmReceiver extends BroadcastReceiver { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         final String action = intent.getAction(); 
    
         if ("my-Pet-Notification".equals(action)) { 
          if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
           // set repeating alarm, calls setExactAndAllowWhileIdle 
           MyAlarmMangerSupport.set(context); 
          } 
    
          //execute service to show notification 
          [..] 
         } 
        } 
    } 
    
0

장치 재부팅 및 날짜/시간 변경이 제대로 작동하면 알람 관리자를 다시 등록하십시오.