在每天的特定时间设置启动时间警报

Posted

技术标签:

【中文标题】在每天的特定时间设置启动时间警报【英文标题】:setting alarm on boot time at a specific time every day 【发布时间】:2014-08-09 15:25:06 【问题描述】:

我已经在启动完成时在 android 中启动了上午 9:00 的警报。但在完成启动后每分钟触发一次警报。

我的要求是它应该在启动后设置警报,但只在上午 9:00 发出警报。

这是我的代码: 公共类 AlarmUtil 私有 PendingIntent alarmIntent;

public static void setAlarm(Context context) 

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

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 00);
    calendar.set(Calendar.SECOND, 00);
    calendar.set(Calendar.AM_PM, Calendar.AM);
    //calendar.setTimeInMillis(calendar.getTimeInMillis());
    calendar.add(Calendar.SECOND, 1);

    Intent intent = new Intent(context, Services.class);
    PendingIntent pintent = PendingIntent.getService(context, 123456789,
            intent, 0);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(), 1 * 60 * 1000, pintent);




public class AlarmBroadcastReciever extends BroadcastReceiver 

@Override
public void onReceive(Context context, Intent intent) 
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
        Toast.makeText(context, "Booted!", Toast.LENGTH_SHORT).show();
        AlarmUtil.setAlarm(context);

    


服务(我的服务类)

public class Services extends IntentService 

public Services(String name) 
    super("services");
    // TODO Auto-generated constructor stub


public Services() 
    super("services");
    // TODO Auto-generated constructor stub


@Override
public void onCreate() 
    super.onCreate();



@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    MyApp.counter += 1;

    Toast.makeText(getApplicationContext(),
            "Service started: " + MyApp.counter, Toast.LENGTH_LONG).show();
    return START_STICKY;


@Override
public IBinder onBind(Intent arg0) 
    // TODO Auto-generated method stub
    return null;


@Override
protected void onHandleIntent(Intent intent) 
    Toast.makeText(getApplicationContext(), "handling intent",
            Toast.LENGTH_LONG).show();


我缺乏的地方。请帮我。提前致谢。

【问题讨论】:

看这个文档developer.android.com/reference/android/app/… 【参考方案1】:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
        calendar.getTimeInMillis(), 1 * 60 * 1000, pintent);

通过调用setRepeating(),您将指示它每分钟触发一次意图。您可能打算改用set()setExact()

此外,您将闹钟设置为当前日期的 9:00。我不确定您的目标是什么,但是如果您想要“下一个 9:00”的闹钟(即作为闹钟),如果当前时间大于 9:00,您可能应该添加一天。来自文档:

如果规定的触发时间是过去的,就会触发警报 马上。

编辑:如果您需要每天在 9:00 触发此警报,那么 setRepeating() 是正确的,但以毫秒为单位的时间应该是 @ 987654327@。不过,请注意有关过去警报的说明。如果您在上午 10:00 启动手机并使用当前代码,除了未来的警报之外,您还会收到立即警报。

而且,正如@DerGolem 所指出的,如果您以 API 级别 19 为目标,那么这些警报将是不准确的(并且没有 setRepeatingExact())。如果您需要准确警报,那么您必须使用setExact() 安排一个警报,然后在该警报触发时安排下一个警报,依此类推。

【讨论】:

我刚刚添加了 i min gap 只是为了测试目的。问题是如果我在上午 8 点 56 分重新启动系统。 setAlarm() 将被调用,然后它将在每分钟后启动服务。假设启动时间是上午 8:56,我想在上午 9:00 收到警报。它将在上午 8 点 57 分、上午 8 点 58 分和上午 8 点 59 分发出警报。 @DeepikaLalra 我不确定我是否理解。如果您想要一个警报,请使用set()setRepeating() 将发出重复警报。这不是你现在遇到的问题吗? Note: Beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use. There are new APIs to support applications which need strict delivery guarantees; see setWindow(int, long, long, PendingIntent) and setExact(int, long, PendingIntent). Applications whose targetSdkVersion is earlier than API 19 will continue to see the previous behavior in which all alarms are delivered exactly when requested. @matiash 我试过了。它工作并在准确的 9:00 发射。但我想问一下它是否会在每天上午 9:00 发出这个警报。因为我想每天早上 9:00 被解雇。 @DeepikaLalra 用这个新信息编辑了答案(很抱歉,它真的不明白你的问题)。【参考方案2】:

您好,我使用了以下代码,并且能够在每天上午 9 点生成警报

alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmService.class);

    PendingIntent pintent = PendingIntent.getService(this, 123456789,
            intent, 0);

    // Set the alarm to start at 8:30 a.m.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 00);


    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(), 1000 * 60 * 1 * 60 * 24, pintent);

【讨论】:

【参考方案3】:

您需要将“1 * 60 * 1000”替换为 AlarmManager.INTERVAL_DAY 以每天设置

【讨论】:

以上是关于在每天的特定时间设置启动时间警报的主要内容,如果未能解决你的问题,请参考以下文章

在Android中,每天在特定时间设置重复警报

如何在android中的特定时间和日期获得警报?

每天/在特定时间启动应用程序[重复]

Android 警报管理器在重新启动设备或从后台杀死应用程序后取消

Android 在特定时间使用 AlarmManager 启动服务并且设备启动完成

计划的警报管理器无法正常工作 Android