AlarmManager & BroadcastReceiver 未执行或间隔时间错误

AlarmManager & BroadcastReceiver did not execute or in wrong interval times

我尝试了 AlarmManager 的示例,它在 https://developer.android.com/training/scheduling/alarms

我的MainActivity.java是这样的:

    alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, BroadcastReciever.class);
    alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    // call every 5mins
    alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
            1000 * 60 * 5L, alarmIntent);

我的BroadcastReciever.java是这样的:

public class BroadcastReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("Execute time:" + Calendar.getInstance().getTime());
    }
}

我希望它每 5 分钟输出类似“Execute time:Thu Apr 14 17:33:45 GMT+09:00 2022”的内容 我在我的物理设备上安装了该应用程序并在我的物理设备上重新启动了该应用程序。(设备仍然使用 USB 电缆连接到 PC。)Android studio 在下面捕获这些日志:

2022-04-14 17:33:45.009 13580-13580/? I/com.example.ss: Late-enabling -Xcheck:jni

2022-04-14 17:33:45.050 13580-13580/? E/com.example.ss: Unknown bits set in runtime_flags: 0x8000

2022-04-14 17:33:45.611 13580-13580/com.example.ss I/Perf: Connecting to perf service.

2022-04-14 17:33:45.671 13580-13580/com.example.ss I/System.out: Execute time:Thu Apr 14 17:33:45 GMT+09:00 2022

第一个问题是,不是每5分钟输出一次。 第二个问题是,有时它会输出这样的东西(不是每 5 分钟)

2022-04-14 11:56:09.145 ...

2022-04-14 11:56:09.150 ...

2022-04-14 11:56:09.154 ...

我需要制作一个应用程序,每隔 day.so 在 0:00 创建一个新的日志文件我尝试使用 alarmmanager 和 broadcastReciever。 我需要确保日志文件只创建一次,(我猜在第二种情况下可能会创建三次)

Whosebug 上有几十个类似的问题。你真的应该在创建新问题之前进行搜索。

基本上,setRepeating() 是不准确的。为了节省电池电量,Android 将更改警报触发的实际时间。你无法控制它。如果你需要精确的时间,你应该使用 setExact() 之类的东西。这不是一个重复闹钟,所以如果你需要一个重复闹钟,你应该这样做:当闹钟被触发时,做任何事情然后设置下一个闹钟。

您写道:

I need to make a app, which make a new logfile at 0:00 every day.so I try the alarmmanager & broadcastReciever. I need to make sure the logfile only be created one time,(in second case may create three times I guess)

所以您应该为第二天的 00:00 安排 setExact() 闹钟。当该警报触发时,轮换您的日志文件,然后为第二天 00:00 设置警报。这将确保您的闹钟在正确的时间响起,并且每天只触发一次。