AlarmManager有时会延迟触发,或者根本不会触发

问题描述 投票:0回答:2

我有一个简单的AlarmManager应用程序,该应用程序每30分钟向我发送一封电子邮件,但无法正常工作。有时它会延迟,有时甚至什么都不会发送。有人可以解释为什么会这样吗?

MainActivity类:

@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));
            }
        }
    });
}
java android alarmmanager
2个回答
1
投票

使用不精确的警报时,将alarmMgr.setInexactRepeatingalarmMgr.setRepeating更改为:

这些警报比setRepeating(int,long,long,PendingIntent)传统上提供的严格重复执行具有更高的能效,因为系统可以调整警报的发送时间以使其同时触发,从而避免将设备从睡眠中唤醒更多超出必要。

您的警报的第一个触发器不会在请求的时间之前出现,但是在该时间之后的几乎整个时间间隔内都不会发生。


0
投票

在您的班级代码中。

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;
 }
}

文档[https://developer.android.com/training/scheduling/alarms]

© www.soinside.com 2019 - 2024. All rights reserved.