【问题标题】:AlarmManager alarm fires immediatelyAlarmManager 警报立即触发
【发布时间】:2019-01-11 23:20:59
【问题描述】:

我正在测试AlarmManager 以在我的应用程序中使用,当我希望它在 1 分钟后触发时,它会立即触发我的广播接收器。代码如下:

public class SetMealTimersActivity extends Activity {
    PendingIntent pi;
    BroadcastReceiver br;
    AlarmManager am;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_meal_timers);

        br = new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent i) {
                Toast.makeText(c, "Ready to Go!", Toast.LENGTH_LONG).show();
            }
        };
        registerReceiver(br, new IntentFilter("com.ian.mealtimer"));
        pi = PendingIntent.getBroadcast(this, 0, new Intent(
                "com.ian.mealtimer"), 0);
        am = (AlarmManager) (this.getSystemService(Context.ALARM_SERVICE));         
        am.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 
                60 * 1000, pi );
    }

【问题讨论】:

  • Intent intentAlarm = new Intent(this, AlarmReciever.class);AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); //set the alarm for particular time alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); where time = 60*1000

标签: android alarmmanager


【解决方案1】:

试试:

  am.set(AlarmManager.RTC_WAKEUP, 
      Calendar.getInstance().getTimeInMillis()+60*1000, pendingIntent);

它对我有用。

【讨论】:

  • 我刚刚用你的代码代替了我代码中的最后一行,但它仍然不适合我 - 广播接收器正在立即触发???
【解决方案2】:

如果使用准确的闹钟,请确保它的时间是未来的。否则它会立即触发。

【讨论】:

    【解决方案3】:

    尝试将SystemClock.elapsedRealtime() 更改为System.currentTimeMillis() 并将AlarmManager.ELAPSED_REALTIME_WAKEUP 更改为AlarmManager.RTC_WAKEUP

    【讨论】:

    • 这给了我“系统类型的 currentTimeInMillis() 方法未定义”
    • 抱歉,现在是 currentTimeMillis()
    • 错字 - System.currentTimeMillis() 被接受。但是仍然遇到同样的问题 - 广播接收器立即触发,而不是 1 分钟后
    • 将 ELAPSED_REALTIME_WAKEUP 更改为 RTC 或 RTC_WAKEUP
    • 也试过了(RTC 和 RTC_WAKEUP)。没有区别 - 仍然会立即触发????
    【解决方案4】:

    如果您使用 Android API > 18 或使用 API AlarmManager.setExact(int, long, PendingIntent),因为 API 19 更改了此方法的时间管理。也许这会有所帮助。阅读documentation了解更多信息。

    【讨论】:

    • setExact(使用与以前相同的参数)给出完全相同的结果 - 立即触发广播接收器:0(
    • 您是否尝试调试过您的代码? BroadcastReceiver 真的是在 AlarmManager.set 之后调用的吗?还是在接收者注册后立即调用?
    • 道歉 - 我的 BroadcastReceiver 实际上没有被调用,只是显示了定义它的 Activity。很抱歉造成混乱
    【解决方案5】:

    id 设为pendingIntent

    pendingIntent = PendingIntent.getActivity(this, 999123266,
        intent, PendingIntent.FLAG_UPDATE_CURRENT);
    

    所有例子

    public void setAlarm_sat(int dayOfWeek1) {
        cal1.set(Calendar.DAY_OF_WEEK, dayOfWeek);
        Intent intent = new Intent(this, RemmemberActivity.class);
        pendingIntent = PendingIntent.getActivity(this, 999123266,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        Long alarmTime = cal1.getTimeInMillis();
        AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC_WAKEUP, 
                        alarmTime,7*24 * 60 * 60 * 1000, 
                        pendingIntent);
        // am.set(AlarmManager.RTC, cal1.getTimeInMillis(), pendingIntent);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多