Android重复闹钟,每次打开时覆盖自己

时间:2017-04-04 05:41:27

标签: android android-alarms

我在应用启动时从MainActivity运行以下警报。我想我已经将它编程为在每次新的应用程序启动时覆盖自己。但我发现很难测试。这真的是压倒一切吗?如果我关闭并打开应用程序很多次我会收到很多警报吗?

如何测试我创建的警报数量?

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

        Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        manager.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 60000, pendingIntent);
    }

所以PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)

  • requestCode是? (我假设为警报设置了一个ID,您可以使用新的警报覆盖它)
  • flags呢? (告诉警报如果新警报具有相同的ID,该怎么办?)

2 个答案:

答案 0 :(得分:1)

是的,您覆盖它,因为每次创建活动时都使用相同的请求代码。请求代码是PendingIntent.getBrodacast()方法的第二个参数,并且操作类似于警报的id以便稍后更新它(对于例子取消它)。您可以使用以下代码检查您的闹钟是否已设置:

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_NO_CREATE) != null);

但是,您不需要使用您需要调用的代码设置警报:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, 0 ,pendingIntent);

实际设置闹钟。

关于你的上一个问题,有几个选项可以使用标志:

  

int FLAG_CANCEL_CURRENT表示如果描述的标志   PendingIntent已经存在,应该取消当前的一个   在生成新的之前。

     

int FLAG_IMMUTABLE标志,指示创建的PendingIntent   应该是不可改变的。

     

int FLAG_NO_CREATE Flag>表明如果描述的话   PendingIntent尚不存在,   然后只返回null而不是创建它。

     

int FLAG_ONE_SHOT表示可以使用此PendingIntent的标志   只有一次。

     

int FLAG_UPDATE_CURRENT表示如果描述的标志   PendingIntent已经存在,然后保留它但替换其额外数据   与这个新意图中的内容。

答案 1 :(得分:0)

这是在特定时间内在Android中设置闹钟的方法:

Intent intent = new Intent(context, AlarmService.class);
final int _id = Integer.parseInt(""+MCZManagers.timeToMillies(alarmTime));
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, _id, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, MCZManagers.dateTimeToMillies(alarmDateTime), pendingIntent);

一旦销毁应用程序,警报也会被破坏,不会再次播放。