Android:为短时间间隔安排重复任务不起作用

Android: Scheduling a repeating task for short time intervals isn't working

在 Android 中,我有一个 activity 安排任务(显示通知)每 10 或 15 分钟重复一次,即使应用程序已关闭或终止也是如此。

我尝试使用 AlarmManageralarmManager.setExactalarmManager.setalarmManager.setRepeating 来安排它,其中 none 在准确的时间触发了事件。触发事件有很多延迟。有时它会在准确的时间触发,有时会有延迟。延迟从 15 分钟到几个小时不等。

我看到 android 文档说 AlarmManager 将从 Lollipop 5.1 开始延迟事件。我已经用 Handlers 以及 TimerTaskTimer 尝试过,但是当应用程序被杀死时它们会立即被杀死。

是否有任何替代解决方案可以运行很短的间隔时间并且也在后台运行。

你需要的是 Service and a CountDownTimer.

启动服务并将倒数计时器初始化 10 到 15 分钟,当计时器完成时,您可以重新初始化相同的计时器并在计时器的 onFinish 方法中显示通知。

这样即使应用程序关闭,您也会显示通知。

更新后的工作示例:

这个设置了特定日期和时间的闹钟。然后每 3 分钟重复一次。

主要活动:

public class MainActivity extends AppCompatActivity {

    private AlarmManager alarmManager;

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

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 17);
        calendar.set(Calendar.MINUTE, 03);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);

        Intent dailyIntent = new Intent(this, AlarmActivity.class);

        PendingIntent mondayIntent = PendingIntent.getActivity(this, 1000, dailyIntent, 0);

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

        if (Build.VERSION.SDK_INT >= 19) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mondayIntent);
        } else {
            System.out.println("------------------------");
        }
    }
}

警报活动:

public class AlarmActivity extends Activity {

    private AlarmManager alarmManager;
    Intent intent;
    PendingIntent pendingIntent;

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

        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        intent = new Intent(this, AlarmActivity.class);
        pendingIntent = PendingIntent.getActivity(this, 1000, intent, 0);

        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() +
                        60 * 1000 * 3, pendingIntent);
    }
}

希望对您有所帮助。

编辑: 也不要忘记在系统重启和程序包(您的应用程序)更新时设置警报。