0

我有三个问题:

1)到目前为止我已经实现了这个:

public final class CalculateTime {

    public int iHour;
    public int iMinute;
    public Calendar calendar;

    private void calculateRandomNumbers() {
        Random randomNumberGenerator = new Random();
        iHour = randomNumberGenerator.nextInt(19 - 9) + 9;
        iMinute = randomNumberGenerator.nextInt(59);
    }

    public void calculateRandomTime() {
        calculateRandomNumbers();
        calendar = GregorianCalendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, iHour);
        calendar.set(Calendar.MINUTE, iMinute);
    }
}

所以通知应该在 9 点到 19 点之间的任何时间推送一次。但通知会在 9 点到 19 点之间发送两次。

2)当计算过去时,立即推送通知。

3) 我想每周发送一次通知,我该如何实现?我努力了:

// For Monday
calendar.set(Calendar.DAY_OF_WEEK, 2)

但我不确定这是否正确,因为我无法轻易测试。(我每次都等不了一周!):/

更多代码,设置警报:

public final class NotificationService extends IntentService {

    public static final String DESCRIPTION = "description";
    public static final String HEADLINE = "headline";

    private static final int FM_NOTIFICATION_ID = 0;

    public NotificationService() {
        super("NotificationService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        /*
         * This method is invoked whenever an intent for this service is fired.
         * The actual firing is done by the AlarmManager in the
         * TodoEntriesAdapter, but really we don't care at this point where
         * exactly the intent came from.
         */
        String description = intent.getStringExtra(DESCRIPTION);
        String headline = intent.getStringExtra(HEADLINE);

        addNotification(description, headline);
    }

    private void addNotification(String description, String headline) {

        NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle(headline)
            .setContentText(description)
            .setAutoCancel(true);

        Intent notificationIntent = new Intent(this, ReadNotification.class);
        notificationIntent.putExtra("description", description);
        notificationIntent.putExtra("headline", headline);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(contentIntent);

        // Add as notification  
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
        manager.notify(FM_NOTIFICATION_ID, builder.build());  
        }
    }
4

1 回答 1

0
  1. The notification is sent twice.

    Seeing the code that actually interacts with the AlarmManager would be helpful. If you display the selected time (using for example the logging facility) you will be able to see which notification is the right one and if the code that schedules the alarm is being called twice.

  2. When the calculation is in the past, the notification is pushed right away.

    This is the documented behaviour. You will need to manually check if the time is in the past, and move it forward by a week if it is.

  3. I want to send a notification once a week.

    Try setRepeating(type, start, 7 * AlarmManager.INTERVAL_DAY, operation).

    I can't test this easily.

    Besides the primitive method of changing the phone's date manually, you can test the app by mocking the AlarmManager class (replace it with a dummy class that checks the right methods are called with the right parameters).

于 2013-06-21T13:41:52.027 回答