Java AlarmManager有时会延迟触发,或者根本不触发
我有一个简单的AlarmManager应用程序,每30分钟向我发送一封电子邮件,但它不能正常工作。有时它会延迟,有时它根本不发送任何东西。有人能解释为什么会这样吗 主要活动类别:Java AlarmManager有时会延迟触发,或者根本不触发,java,android,alarmmanager,Java,Android,Alarmmanager,我有一个简单的AlarmManager应用程序,每30分钟向我发送一封电子邮件,但它不能正常工作。有时它会延迟,有时它根本不发送任何东西。有人能解释为什么会这样吗 主要活动类别: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AlarmMan
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
}
MyAlarmReceiver onReceive方法
private FusedLocationProviderClient fusedLocationClient;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context);
fusedLocationClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if(location != null)
{
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
Date date = new Date();
sendMail(location.getLongitude()+"", location.getLatitude()+"", formatter.format(date));
}
}
});
}
私有FusedLocationProviderClient fusedLocationClient;
@凌驾
公共void onReceive(上下文、意图){
Toast.makeText(上下文,“报警已关闭”,Toast.LENGTH_SHORT).show();
fusedLocationClient=LocationServices.getFusedLocationProviderClient(上下文);
fusedLocationClient.getLastLocation().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
如果(位置!=null)
{
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd.MM.yyyy HH:MM:ss”);
日期=新日期();
sendMail(location.getLongitude()+“”,location.getlation()+“”,formatter.format(date));
}
}
});
}
在您的课程代码中
public class Alarm extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
// wl.release();
}
public void setAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 *
10, pi); // Millisec * Second * Minute
}
public void cancelAlarm(Context context)
{
Intent intent = new Intent(context, Alarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
then set alarm service
public class YourService extends Service
{
Alarm alarm = new Alarm();
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
alarm.setAlarm(this);
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId)
{
alarm.setAlarm(this);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
文档[在使用不精确报警时更改:
这些警报比传统上由setRepeating(int、long、long、pendingent)提供的严格重复警报更省电,因为系统可以调整警报的传递时间,使其同时触发,避免在必要时将设备从睡眠中唤醒
您的警报的第一个触发器不会在请求的时间之前触发,但它可能不会在该时间之后的几乎整个时间间隔内触发