如何在Android上测试每日闹钟?

gra*_*can 6 testing android automated-tests alarm alarmmanager

我的一个宠物项目显示用户定义的特定日期的通知.我用

AlarmManger.setRepeating(AlarmManager.RTC_WAKEUP, millis, AlarmManager.INTERVAL_DAY, pendingIntent)
Run Code Online (Sandbox Code Playgroud)

安排每日警报,启动应用程序以决定是否应该今天显示通知.

问题是有时每天警报停止工作.我知道了很多原因(设备重启,日期/时间更改,应用程序重新安装,打盹模式),我确信有一些原因我还没有找到(欢迎提出想法!).

我的问题是如何针对所有可能的风险正确测试警报?仪器测试适合这里吗?

die*_*ter 6

我的问题是如何针对所有可能的风险正确测试警报?仪器测试适合这里吗?

由于它AlarmManager是Android OS的一部分,因此经过了良好的测试,因此您无需进行任何测试或单元测试即可对其进行测试。您可以测试由警报调用的服务,但无需测试警报设置是否正确。

在少数情况下,您的警报被丢弃,失效或被忽略。您已经给他们打电话了:

  • 重新启动
  • 准时变更
  • 在打ze模式

现在,您可以使用系统通知(操作系统广播)来重新配置警报。

重新启动时
,设备关闭时会丢弃警报,因此在重新启动时再次设置

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

准时更改准时更改
相同的步骤:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


我相信在打ze模式下,如果设备进入打ze模式 ,则无需显示任何不相关的通知。无论如何,即使设备处于打there状态,也有一种方法可以触发警报。

重要的是要知道,打ze​​模式是从API级别23开始的一项新功能

  1. 用户必须将您的应用列入白名单并为您的应用禁用电池优化

  2. 使用setExactAndAllowWhileIdle方法为Android级别2​​3+的设备设置警报:

    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, period, pendingIntent);
    
    Run Code Online (Sandbox Code Playgroud)

    重要提示:作为单发警报,您必须在警报接收器中再次设置它:

    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
                 [..]
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)