代码之家  ›  专栏  ›  技术社区  ›  ravi raghav

Android中特定日期的调度程序

  •  0
  • ravi raghav  · 技术社区  · 9 年前

    我正在尝试制作一个调度程序,当预定的日期和时间到来时,它会给你一个通知。我正在使用广播接收器类,我已经完成了一天的工作。

    这意味着你可以在一个月内选择任何一天和时间,这将很好,但如果用户选择下个月或下一年,我会遇到很多问题 这是我的计划按钮点击代码。

    这里,mDay、mMonth、mYear、mHour、mMinute是用户为其活动选择的日期和时间,cday、cmmonth、cyear是当前日期和时间。

    btn_schedule.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                System.out.println("Entered in Alarm on click");
    
                Calendar cal = Calendar.getInstance();
                Hour = cal.get(Calendar.HOUR_OF_DAY);
                Minute = cal.get(Calendar.MINUTE);
    
                cday = cal.get(Calendar.DATE);
                cmonth = cal.get(Calendar.MONTH);
                cyear = cal.get(Calendar.YEAR);
    
                dday = mDay - cday;
                dmonth = mMonth - cmonth;
                dyear = mYear - cyear;
    
                if (dyear == 0) {
                    if (dmonth == 0) {
                        if (dday == 0) {
                            long CurrentMilli = (mHour * 3600 * 1000) + (mMinute * 60 * 1000);
            long SelectedMilli = (Hour * 3600 * 1000) + (Minute * 60 * 1000);
    
            long diff = CurrentMilli - SelectedMilli;
            diff1 = diff;
            System.out.println("difference and " + diff + "diff1" + diff1);
    
            new CountDownTimer(diff, 1000) { // adjust the
                // milli
                // seconds
                // here
    
                public void onTick(long millisUntilFinished) {
                }
    
                public void onFinish() {
                }
            }.start();
        }
    
                        } else {// Else if day is not the same
                            int dh = 24 - Hour; // today's remaining hours till
                                                // next date
                            int dm = 60 - Minute;// today's remaining minutes
                                                    // till next date
                            long dhm = dh * 3600000;// in milli
                            long dmm = dm * 60000;// in milli
                            long totaltm = dhm + dmm;
                            diff1 = totaltm;
                            long lh = mHour * 3600000;// selected hours in milli
                            long lm = mMinute * 60000;// selected min in milli
                            ltt = lh + lm;
    
                            new CountDownTimer(totaltm, 1000) { // adjust the
                                // milli
                                // seconds
                                // here
    
                                public void onTick(long millisUntilFinished) {
                                }
    
                                public void onFinish() {
                                    dday--;
                                    forDay1(dday);
                                }
                            }.start();
    
                        }
                    } else {
                        // Else if month is not the same
    
    
    
                    }
    
                } else {// Else if year is not the same
    
                }
                long a = diff1;
                Long alertTime = new GregorianCalendar().getTimeInMillis() + a;
                Intent alertIntent = new Intent(HomeScreen.this, Alerts.class);
                AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                am.set(AlarmManager.RTC_WAKEUP, alertTime, PendingIntent
                        .getBroadcast(HomeScreen.this, 2, alertIntent,
                                PendingIntent.FLAG_UPDATE_CURRENT));
                System.out.println("Notification is called");
                Intent moreinfo = new Intent(HomeScreen.this, HomeScreen.class);
                TaskStackBuilder tsb = TaskStackBuilder
                        .create(getApplicationContext());
                tsb.addParentStack(HomeScreen.class);
                tsb.addNextIntent(moreinfo);
    
    
    
            }
        });
    

    这是我的广播课:

    public class Alerts extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("Inside Service");
            createNotification(context, "Times Up!", "Start Your Activity!",
                    "Click here to enter the application!");
    
        }
    
        public void createNotification(Context context, String msg, String msgtext,
                String msgalert) {
            System.out.println("Method inside service is called");
            PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(
                    context, HomeScreen.class), 0);
            NotificationCompat.Builder ncb = new NotificationCompat.Builder(context)
                    .setContentTitle(msg).setContentText(msgtext)
                    .setTicker(msgalert).setSmallIcon(R.drawable.ic_launcher)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setDefaults(Notification.DEFAULT_VIBRATE);
    
            ncb.setContentIntent(pi);
            ncb.setAutoCancel(true);
    
            NotificationManager nm = (NotificationManager) context
                    .getSystemService(Context.NOTIFICATION_SERVICE);
            nm.notify(2, ncb.build());
    
        }
    
    }
    

    这个代码可以在一个月内的任何一天工作。

    1 回复  |  直到 9 年前
        1
  •  1
  •   sorianiv    9 年前

    你不需要做所有计算差异的自定义逻辑 ddat 和大的 if (dyear == 0) { …只需将用户选择的字段设置为 Calendar :

    Calendar cal = Calendar.getInstance();
    cal.set(mYear, mMonth, mDay, mHour, mMinute);
    

    然后,您可以使用新日历的时间戳作为警报时间。

    long alertTime = cal.getTimeInMillis();