报警管理器每日重复单词不正确

Posted

技术标签:

【中文标题】报警管理器每日重复单词不正确【英文标题】:Alarm Manager daily repeat works uncorrectly 【发布时间】:2018-04-07 09:54:16 【问题描述】:

我想在我的应用中每天在不同时间启动两项服务。为此,我在我的SplashActivity 中使用AlarmManager 并使用SharedPreferences 我修复了此AlarmManager 仅在该应用程序打开的第一次运行。 我使用以下代码:

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

    //Check if first run, start alarms
    SharedPreferences preferences = getSharedPreferences("init", MODE_PRIVATE);
    if (preferences.getBoolean("firstTime", true)) 
        startCheckService(getApplicationContext());
        startMorningService(getApplicationContext());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("firstTime", false);
        editor.apply();

    

这是警报的方法:

public void startCheckService(Context c)
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,23);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    PendingIntent pi = PendingIntent.getService(c,0,new Intent(c,CheckService.class),PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) c.getSystemService(ALARM_SERVICE);
    am.cancel(pi);
    am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),24 * 60 * 60 * 1000,pi);


public void startMorningService(Context c)
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,8);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    PendingIntent pi = PendingIntent.getService(c,0,new Intent(c,CheckTodayEvents.class),PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) c.getSystemService(ALARM_SERVICE);
    am.cancel(pi);
    am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),24 * 60 * 60 * 1000,pi);
  

但是我的问题。每次我打开我的应用程序时,alarmManager 都会运行,我的服务也会运行。为什么?我该如何解决?

【问题讨论】:

我们的 targetSdkVersion 是什么? 它是 25 @Sagar 你试过我发布的链接了吗? 我使用广播接收器而不是服务,我的问题已解决 太棒了。现在我的建议是发布您的解决方案的答案并接受它,这样该帖子将从未回答的问题队列中删除。 【参考方案1】:

终于找到了解决办法。唯一要做的就是将PendingIntent的ServicegetService()改为BroadcastReceiver

public static void startCheckService(Context c)

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,23);
    calendar.set(Calendar.MINUTE, 45);
    calendar.set(Calendar.SECOND, 0);

    if(calendar.getTimeInMillis() >= Calendar.getInstance().getTimeInMillis()) 

        PendingIntent pi = PendingIntent.getBroadcast(c, 0, new Intent(c, CheckService.class), PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) c.getSystemService(ALARM_SERVICE);

        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTime().getTime(), AlarmManager.INTERVAL_DAY, pi);
    

我不知道为什么,但我的问题已经解决了。

【讨论】:

以上是关于报警管理器每日重复单词不正确的主要内容,如果未能解决你的问题,请参考以下文章

java Android的简单报警管理器

带有BroadcastReceiver的报警管理器

使用Android服务,实现报警管理器和广播接收器

如何取消警报管理器的每日通知?

为啥我不应该使用默认的 java 安全管理器 [重复]

win10 登入界面显示: 本地会话管理器 服务未能登录 RPC 服务器不可用 随后一直重启重复