AlarmManager иногда срабатывает с задержкой или вообще не срабатывает - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть простое приложение 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));
            }
        }
    });
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Измените alarmMgr.setInexactRepeating для alarmMgr.setRepeating , так как вы используете неточные аварийные сигналы:

Эти аварийные сигналы более энергоэффективны, чем строгие рецидивы, обычно предоставляемые setRepeating (int, long, long, PendingIntent), поскольку система может регулировать время доставки сигналов тревоги, чтобы они срабатывали одновременно, избегая более полного выхода устройства из спящего режима.

Ваш первый сигнал тревоги триггер не будет раньше запрошенного времени, но может не произойти в течение почти полного интервала после этого времени.

0 голосов
/ 15 апреля 2020

В вашем коде класса.

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]

...