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);
}
答案 0 :(得分:1)
对于可能被滥用并耗尽电池续航时间的行为,Android会成为一个真正的婊子。在错误的时间重复闹钟,我遇到了很多麻烦。我的应用程序做了什么(并且它在大多数情况下完美无缺,稍后更多)是注册非重复警报然后在警报接收器类(在您的情况下它是AppMoniteringBroadCastReceiver
)中它接收到警报,它在将来的适当时间再次注册相同的警报(在你的情况下,20秒后)。因此,它没有重复警报,而是有一系列非重复警报。
我的应用程序以三种方式注册非重复警报,具体取决于Android版本:对于低于KitKat的Android版本使用AlarmManager.set()
,它会使用AlarmManager.setExact()
从Kitkat到Marshmallow,最后是将AlarmManager.setExactAndAllowWhileIdle()
用于Marshmallow及以上。
这在大多数Android设备上都是准确的,但可能会有电池优化功能(如Doze或其他供应商实施),这会使这个问题变得混乱并阻止您的应用接收警报。除了告诉用户如何从Doze或其他特定于供应商的实现中豁免您的应用程序之外,您无法做任何事情。