Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AlarmManager有时会延迟触发,或者根本不触发_Java_Android_Alarmmanager - Fatal编程技术网

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

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

我有一个简单的AlarmManager应用程序,每30分钟向我发送一封电子邮件,但它不能正常工作。有时它会延迟,有时它根本不发送任何东西。有人能解释为什么会这样吗

主要活动类别:

@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)提供的严格重复警报更省电,因为系统可以调整警报的传递时间,使其同时触发,避免在必要时将设备从睡眠中唤醒

您的警报的第一个触发器不会在请求的时间之前触发,但它可能不会在该时间之后的几乎整个时间间隔内触发