在Android每月重复闹钟

时间:2015-03-04 08:50:15

标签: android android-alarms

我在设置重复警报时遇到一些问题,该重复警报将在每个月或每两个月在特定日期(由用户输入)触发。 到目前为止,我正在使用服务进行通知,BroadcastReceiver以及待处理的Intent。我无法理解的是:

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 30*month, pendingIntent);

我们如何在这里设置功能以及它将如何影响电池寿命,还有其他任何事情(例如在数据库中存储日期并且仅在触发某些事件时调用它)等等。 1.Notification Service扩展服务

public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        // Getting Notification Service
        mManager = (NotificationManager) this.getApplicationContext()
                .getSystemService(
                        this.getApplicationContext().NOTIFICATION_SERVICE);
        /*
         * When the user taps the notification we have to show the Home Screen
         * of our App, this job can be done with the help of the following
         * Intent.
         */
        Intent intent1 = new Intent(this.getApplicationContext(), com.expandablelistItems.demo.adapter.DynamicActivity.class);

        Notification notification = new Notification(R.drawable.ic_launcher,
                "Payment of your demoReminder", System.currentTimeMillis());

        intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                | Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
                this.getApplicationContext(), 0, intent1,
                PendingIntent.FLAG_UPDATE_CURRENT);

        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        notification.setLatestEventInfo(this.getApplicationContext(),
                "demo", "Payment of your demoReminder",
                pendingNotificationIntent);

        mManager.notify(0, notification);
    }

2。重复方法

if  (current_Month == Calendar.FEBRUARY){//for feburary month)
            GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();    
            if(cal.isLeapYear(calendar.get(Calendar.YEAR))){//for leap year feburary month  
                alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 29*month, pendingIntent);
                Toast.makeText(getActivity(), "februry", Toast.LENGTH_SHORT).show();}
            else{ //for non leap year feburary month
                Toast.makeText(getActivity(), "feb", Toast.LENGTH_SHORT).show();
                alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 28*month, pendingIntent);
            }
        }

这是广播接收器

 @Override
    public void onReceive(Context context, Intent intent) {
    // When our Alaram time is triggered , this method will be excuted (onReceive)
    // We're invoking a service in this method which shows Notification to the User
     Intent myIntent = new Intent(context, NotificationService.class);
     context.startService(myIntent);
   }

其中notificationService是第一个扩展服务的代码

3 个答案:

答案 0 :(得分:3)

出于以下两个原因,您应该避免使用间隔为30天的SetRepeating

  1. 它不会在每个月的同一天重复(也可能会在一个月内跳过)。
  2. 由于API 19 SetRepeating不精确且功能类似于SetInexactRepeating,这意味着可能会将警报转移到整个间隔持续时间(在您的情况下最多30天)。
    正如docs

    中所述
      

    您的闹钟首次触发不会在请求的时间之前,但是   在此之后几乎整整一段时间内可能不会发生

  3.      只要您希望在确切的一天触发警报,您​​应该使用set(int, long, PendingIntent)并在每个实例后计算下一个警报。

答案 1 :(得分:2)

基本上,

  • 您可以将pendigIntent初始化为将接收警报并触发预期操作的特定Intent。
  • AlarmManager.INTERVAL_DAY * 30 * month - 指定月数(1个月/ 2个月)* 30 *每日间隔(即24小时)
  • 您可以创建一个类似AlarmReceiver的类,它将具有onReceive()方法,您可以在其中执行操作。

关于电池续航时间和其他方式:

其中一种方法是使用ScheduleThreadExecutor类但运行多个线程并使用AlarmManager我们可以提高性能。

您可以使用 Context.getSystemService(Context.ALARM_SERVICE),而不是创建AlarmManager实例,因为这是系统服务。 这将优化内存使用和电池寿命。

您还可以使用 setInexactRepeating 而不是setRepeating,这些警报更节能

有关详细信息,请访问http://developer.android.com/reference/android/app/AlarmManager.html

答案 2 :(得分:0)

如果您的设备已关闭,闹钟将会消失。我建议你在很长一段时间(比如一个月)之后使用一种alternet方式来触发一个动作。尝试提醒或日历活动。

请查看Reminder's Example

请查看Calendar's Event Example