【问题标题】:Intent Service Time Interval Not maintained意向服务时间间隔 未维护
【发布时间】:2016-11-13 16:23:29
【问题描述】:

我创建了一个意图服务,它应该以用户定义的时间间隔向服务器发送数据,但在我的情况下,警报管理器没有正确维护该时间间隔。你能指导我在哪里出错。我也想在设备处于睡眠或空闲模式时运行该服务。这是我的代码。

   public void sosalarmson() {
        Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
        final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, AlarmReceiver.receivercode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), Integer.parseInt(userdefinedinterval) *60* 1000, pendingIntent);
        Toast.makeText(FinalSettings.this, "alarm On", Toast.LENGTH_SHORT).show();
    }

理想情况下,如果我将用户输入设为 15,则警报应在 15 分钟发送意图,而在 10 分钟发送。

【问题讨论】:

    标签: java android alarmmanager android-intentservice


    【解决方案1】:

    我正在使用这段代码,它运行良好:

    定义:

    final int SDK_INT = Build.VERSION.SDK_INT;
    AlarmManager al;
    PendingIntent fintent;
    Intent notif;
    

    我直接使用警报管理器启动服务。_alarm 是您预定义的时间间隔。

    long _alarm;
    
            Calendar now = Calendar.getInstance();
            Calendar wakeupcall = Calendar.getInstance();
            wakeupcall.setTimeInMillis(System.currentTimeMillis());
            wakeupcall.set(Calendar.HOUR_OF_DAY, 18);
            wakeupcall.set(Calendar.MINUTE, 30);
    
            if (wakeupcall.getTimeInMillis() <= now.getTimeInMillis())
                _alarm=wakeupcall.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
            else
                _alarm=wakeupcall.getTimeInMillis();
    
    al = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            notif= new Intent(this,TestNotifyService.class);
            fintent = PendingIntent.getService(this,0,notif,0);
    
    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
                al.set(AlarmManager.RTC_WAKEUP,_alarm, fintent);
            }
            else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
                al.setExact(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            }
            else if (SDK_INT >= Build.VERSION_CODES.M) {
                al.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,_alarm,fintent);
            }
    

    【讨论】:

    • 您使用 RTC 而不是 ElapsedTime,但根据文档,RTC 在睡眠模式下不计算时间(UTC 挂钟时间)。还能用吗?
    • 我每天22:00使用这段代码运行。它正在执行确切的时间段。
    • 有一点很清楚,如果我想以 15 分钟的间隔运行,我会将 _alarm 替换为 15*60*1000。但是把时间放在哪里,比如想在 20:00 时触发意图。
    • 我正在使用您的代码,但它没有调用待处理的意图。任何想法。
    • 运行应用程序时会发生什么?
    猜你喜欢
    • 2010-09-22
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多