Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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
Android 安卓&x27;s报警管理器错误周期_Android_Alarmmanager - Fatal编程技术网

Android 安卓&x27;s报警管理器错误周期

Android 安卓&x27;s报警管理器错误周期,android,alarmmanager,Android,Alarmmanager,我正在为我的应用程序创建AlarmManager,以便在不同时段发送短信。当我为AlarmManager设置一个时间(例如5分钟)时,它几乎会立即唤醒1-2次,但在这之后它工作正常。在我改变周期值后,情况会重复。我认为停止AlarmManager或设置中继器是有问题的 这是我的makeAlarm功能: private void makeAlarm() { cancelAlarm(); Intent i = new Intent(this, SmsAlarmReceiver.

我正在为我的应用程序创建AlarmManager,以便在不同时段发送短信。当我为AlarmManager设置一个时间(例如5分钟)时,它几乎会立即唤醒1-2次,但在这之后它工作正常。在我改变周期值后,情况会重复。我认为停止AlarmManager或设置中继器是有问题的

这是我的
makeAlarm
功能:

  private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_UPDATE_CURRENT);

    long firstMillis = System.currentTimeMillis();

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));

    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
                firstMillis + period, pendingIntent);
    }
}
  private void cancelAlarm() {
    try {
        Intent i = new Intent(this, SmsAlarmReceiver.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
                i, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarm.cancel(pIntent);
        pIntent.cancel();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
    private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_CANCEL_CURRENT);

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = 0;


    refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));


    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        long firstMillis = System.currentTimeMillis();
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis + period,
                period, pendingIntent);
    }
}
这是我的
SmsAlarmReceiver
类,它扩展了
BroadcastReceiver

  public class SmsAlarmReceiver extends BroadcastReceiver {
public static final int REQUEST_CODE = 322;


  @Override
  public void onReceive(Context context, Intent intent) {

      Intent i = new Intent(context, SmsSenderService.class);
      context.startService(i);
  }
}

我在
MainActivity
中的
onCreate
方法中创建报警。当我改变周期值时,我也会停止我的报警并重新设置。这个值存储在
SharedReferences
中,因此我尝试在
onSharedPreferenceChanged
中重新创建报警,但在我的情况下没有任何意义。

最后,我解决了它!以下是我在
makeAlarm()
函数中的解决方案:

  private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_UPDATE_CURRENT);

    long firstMillis = System.currentTimeMillis();

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));

    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
                firstMillis + period, pendingIntent);
    }
}
  private void cancelAlarm() {
    try {
        Intent i = new Intent(this, SmsAlarmReceiver.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
                i, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarm.cancel(pIntent);
        pIntent.cancel();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
    private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_CANCEL_CURRENT);

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = 0;


    refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));


    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        long firstMillis = System.currentTimeMillis();
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis + period,
                period, pendingIntent);
    }
}
private void makeAlarm(){
取消报警();
意向i=新意向(此,SmsAlarmReceiver.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(此.getApplicationContext(),SmsAlarmReceiver.REQUEST_代码,
i、 挂起内容标志(取消当前);
SharedReferences refreshSettings=GetSharedReferences(“com.example.xd720p.sensorcontroller_09082016”,
上下文。模式(私人);
双刷新值=0;
refreshForTValue=Double.valueOf(refreshSettings.getString(“tempPeriod”,“30”));

if(refreshForTValue最后,我解决了它!以下是我在
makeAlarm()函数中的解决方案:

  private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_UPDATE_CURRENT);

    long firstMillis = System.currentTimeMillis();

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));

    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
                firstMillis + period, pendingIntent);
    }
}
  private void cancelAlarm() {
    try {
        Intent i = new Intent(this, SmsAlarmReceiver.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
                i, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarm.cancel(pIntent);
        pIntent.cancel();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
    private void makeAlarm() {
    cancelAlarm();

    Intent i = new Intent(this, SmsAlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE,
            i, PendingIntent.FLAG_CANCEL_CURRENT);

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016",
            Context.MODE_PRIVATE);

    double refreshForTValue = 0;


    refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30"));


    if (refreshForTValue <= 0 ) {
        cancelAlarm();
    } else {
        long period = Math.round(refreshForTValue * 60 * 1000);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        long firstMillis = System.currentTimeMillis();
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis + period,
                period, pendingIntent);
    }
}
private void makeAlarm(){
取消报警();
意向i=新意向(此,SmsAlarmReceiver.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(此.getApplicationContext(),SmsAlarmReceiver.REQUEST_代码,
i、 挂起内容标志(取消当前);
SharedReferences refreshSettings=GetSharedReferences(“com.example.xd720p.sensorcontroller_09082016”,
上下文。模式(私人);
双刷新值=0;
refreshForTValue=Double.valueOf(refreshSettings.getString(“tempPeriod”,“30”));

如果(refreshForTValue不可能。请检查refreshForTValue此值。可能是问题所在their@Saveen此值用于检查用户是否为重复设置了零或更少的值。在这种情况下,我只是杀死AlarmManager。我不认为问题在于refreshForTValuesetting on alarm取决于此值。因此,如果它错误或与您所说的不同它会给你不同的感觉situation@Saveen可能会出什么问题?我对此进行了多次调试。如果用户设置的周期大于零,则会打开新警报(在停止上一个警报后)。如果值小于零(或零),警报刚刚停止。好的,您的问题,警报没有按预期重复,对吗?不可能,请检查refreshForTValue此值。可能是问题their@Saveen此值用于检查用户是否为重复设置了零或更少的值。在这种情况下,我只是杀死AlarmManager。我认为问题不在于报警上的refreshForTValuesetting是取决于这个值。所以,如果它错了或者和你想的不同,它会给你不同的结果situation@Saveen可能会出什么问题?我对此进行了多次调试。如果用户设置的周期大于零,则会打开新警报(在停止上一个警报后)。如果值小于零(或零),警报停止了。好的,你的问题是,警报没有像你预期的那样重复,对吗?