如何实施年度和月度重复警报?

Hir*_*ral 8 android

我想在我的app中设置每月和每年的闹钟.我每周都这样做.AlarmManager.INTERVAL_DAY帮助了我.但我找不到实现月度和年度重复的好方法.

搜索到目前为止:

http://www.satyakomatineni.com/akc/display?url=displaynoteimpurl&ownerUserId=satya&reportId=3503

http://groups.google.com/group/android-developers/browse_thread/thread/9f946e40307073c4?pli=1

有没有其他方法可以做到这一点?任何帮助赞赏.

Lau*_*nt' 17

我认为,这种方法存在两个固有问题:

  • AlarmManager不会接受大的时间间隔,因为millis的数量会溢出参数

  • 我不认为Alarms会在你的手机重启后存活下来,这种情况在很长一段时间内肯定会发生.

我建议您将每个警报存储在一个安全的地方,并使用AlarmManager和onBoot接收器的组合来检查列表中的其中一个警报是否必须在当天触发,只是重新安排警报以便在明天将其唤醒.

public class AlarmService extends Service {
  //compat to support older devices
  @Override
  public void onStart(Intent intent, int startId) {
      onStartCommand(intent, 0, startId);
  }


  @Override
  public int onStartCommand (Intent intent, int flags, int startId){
   //your method to check if an alarm must be fired today
   checkForTodayAlarmsAndBehaveAppropriately();

   //reschedule me to check again tomorrow
    Intent serviceIntent = new Intent(AlarmService.this,AlarmService.class);
    PendingIntent restartServiceIntent = PendingIntent.getService(AlarmService.this, 0, serviceIntent,0);
    AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE);
    // cancel previous alarm
    alarms.cancel(restartServiceIntent);
    // schedule alarm for today + 1 day
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 1);

    // schedule the alarm
    alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent);
  }

}
Run Code Online (Sandbox Code Playgroud)

要在启动时启动服务,请使用以下命令:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class serviceAutoLauncher  extends BroadcastReceiver{

@Override
  public void onReceive(Context context, Intent intent) {
      Intent serviceIntent = new Intent(context,AlarmService.class);
      context.startService(serviceIntent);
  }

}
Run Code Online (Sandbox Code Playgroud)

最后将此添加到您的清单中,以安排在每次启动时启动serviceAutoLauncher:

    <receiver android:name="serviceAutoLauncher">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            <category android:name="android.intent.category.HOME"></category>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)


Hir*_*ral 4

我解决了这个问题。在我的应用程序中,多个闹钟设置了不同的重复时间间隔。因此,在我的闹钟广播接收器中,我根据计划重复的时间重新安排了闹钟。我使用日历对象相应地添加月份和年份并再次将其设置为下一个警报。我使用了这样的代码(用于安排下个月的时间)-

PendingIntent sender = PendingIntent.getBroadcast(context,Integer.parseInt(Long.toString(id)), intent1, 0);                             

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(calendar.getTimeInMillis());
calendar.add(Calendar.SECOND, 30);

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

calendar.add(Calendar.MONTH, 1);

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
Run Code Online (Sandbox Code Playgroud)