想要每20秒重复一次警报

时间:2018-01-18 09:18:50

标签: android alarmmanager android-alarms optimistic-locking

AlaramManager工作正常,但重复时间因设备而异

public void StartMoniterning() {
    try {
        Alarammanager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent alarmIntent = new Intent(this, AppMoniteringBroadCastReceiver.class);
        alarmIntent.putExtra("id", 1314);
        pendingIntent = PendingIntent.getBroadcast(this, 1314, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        Alarammanager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP ,
                0, 2*10000,
                pendingIntent);
        Toast.makeText(this, "Starting Monitering",
                Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

检查我的代码段以取消AlaramManager。

private void cancelAlaram() {
    try {
        Alarammanager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(getBaseContext(), AppMoniteringBroadCastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                getApplicationContext(), 1314, i, 0);

        Alarammanager.cancel(pendingIntent);
        pendingIntent.cancel();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

检查AlaramManager是否运行。

public boolean isAlaramManagerExist() {
    Intent myIntent = new Intent(HomeActivity.this, AppMoniteringBroadCastReceiver.class);
    return (PendingIntent.getBroadcast(HomeActivity.this, 1314, myIntent, PendingIntent.FLAG_NO_CREATE) != null);
}

1 个答案:

答案 0 :(得分:1)

对于可能被滥用并耗尽电池续航时间的行为,Android会成为一个真正的婊子。在错误的时间重复闹钟,我遇到了很多麻烦。我的应用程序做了什么(并且它在大多数情况下完美无缺,稍后更多)是注册非重复警报然后在警报接收器类(在您的情况下它是AppMoniteringBroadCastReceiver)中它接收到警报,它在将来的适当时间再次注册相同的警报(在你的情况下,20秒后)。因此,它没有重复警报,而是有一系列非重复警报。

我的应用程序以三种方式注册非重复警报,具体取决于Android版本:对于低于KitKat的Android版本使用AlarmManager.set(),它会使用AlarmManager.setExact()从Kitkat到Marshmallow,最后是将AlarmManager.setExactAndAllowWhileIdle()用于Marshmallow及以上。

这在大多数Android设备上都是准确的,但可能会有电池优化功能(如Doze或其他供应商实施),这会使这个问题变得混乱并阻止您的应用接收警报。除了告诉用户如何从Doze或其他特定于供应商的实现中豁免您的应用程序之外,您无法做任何事情。