无论设置的时间是什么,在1分钟后,AlarmManager的setRepeating()会重复(在这种情况下为5秒,API 18+)

时间:2016-01-04 05:50:29

标签: android alarmmanager

我已将重复时间设置为5秒。第一次吐司在5秒后出现,但是下一次在1分钟后重复一次 我也尝试使用setRepeating()代码,它仍然无法正常工作 这是我的代码:

public void constructJob(){

    Intent alertIntent = new Intent(this, AlarmManagerService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this, 0,
            alertIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP,
            GregorianCalendar.getInstance().getTimeInMillis(),
            repeatTime(),
            pendingIntent
    );

}

public long repeatTime(){
    return 5000;
}

AlarmManagerService.java

public class AlarmManagerService extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "5 seconds have passed",
                            Toast.LENGTH_SHORT).show();
}

7 个答案:

答案 0 :(得分:17)

需要更新文档。截至我认为Android 5.1(API版本22),重复警报的最短时间为1分钟,未来警报的设置时间不能少于5秒。

如果您需要在一分钟内完成工作,只需直接设置闹钟,然后从该闹钟的处理程序中设置下一个闹钟等。

如果您需要在5秒内完成工作,请将其发布到处理程序而不是使用警报管理器?

答案 1 :(得分:12)

不要使用setRepeating()或setInExactRepeating,它在5秒后不会重复。相反,尝试安排一次警报,然后在onReceive()方法中再次重新安排它,就像这样。这将在特定时间间隔(在这种情况下为5秒)后重复

MainActivity.java

public class MainActivity extends AppCompatActivity {

Button btnStartAlarm, btnStopAlarm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnStartAlarm = (Button) findViewById(R.id.btnStartAlarm);
    btnStopAlarm = (Button) findViewById(R.id.btnStopAlarm);

    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);

    final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    btnStartAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
        }
    });

    btnStopAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.cancel(pendingIntent);
        }
    });
}
 }

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}

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

    Log.d("Javed", "onReceive called");
    Toast.makeText(context, "onReceive called", Toast.LENGTH_LONG).show();

    Intent intent1 = new Intent(context, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 100, intent1, 0);
    final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
  }

答案 2 :(得分:0)

试用此代码:
<div class="entry-content" itemprop="text"> <p> // <-- Need to add class to this p element <img src="/example.jpg" class='size-full'> </p> </div>

答案 3 :(得分:0)

请尝试以下代码:

Long time = new GregorianCalendar().getTimeInMillis() +  3000;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,5000, pendingIntent);

运行此代码后,警报将在3秒后触发,之后每5秒触发一次。

同时尝试使用WakefulBroadcastReceiver代替BroadcastReceiver,因为看起来手机在一段时间后处于打盹模式(如果您使用的是Android M)。请确保包含{{1正确使用它的权限。

此外,您必须记住,您的闹钟的第一次触发不会在请求的时间之前,但在此之后几乎整整的间隔可能不会发生。此外,虽然重复报警的整个周期将按要求进行,但任何两次连续发出报警之间的时间可能会有所不同。

<强>另外

WAKE_LOCK不保证触发时间的准确性。您可以在API 19之前使用setInExactRepeating(),但从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。 您可以做的是,设置一个非重复警报,当警报触发时,您可以在setRepeating()中再次重置警报。有新的API支持需要严格交付保证的应用程序;见BroadcastReceiversetWindow(int, long, long, PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前在请求时准确传递所有警报的行为。

<强>参考

setInexactRepeating() Official documentation

StackOverflow answer

答案 4 :(得分:0)

试试这个

$result = dbConnect()->prepare("SELECT email, password, image FROM users WHERE email= :email AND password= :password");

答案 5 :(得分:0)

试试这个

public void constructJob(){
Intent alertIntent = new Intent(this, AlarmManagerService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this, 0,
        alertIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        GregorianCalendar.getInstance().getTimeInMillis(),
        1000*5,
        pendingIntent);

}

答案 6 :(得分:0)

我有完全相同的问题。我花了几个小时调试这个,最后我发现如果重复时间设置为低于一分钟,它总会在一分钟的时间内触发警报!?

我按照这个例子: http://www.compiletimeerror.com/2015/02/how-to-make-alarm-repeat-in-android-code.html#.Vp5UrCorKM8

它显示警报在8秒内开火,但在我的情况下它不会。

我尝试将重复时间设置为几分钟,并且工作正常。我也喜欢接收器的发射警报提供更准确的重复次数(一个接收器用于启动警报管理器,它由自定义意图过滤器调用)