未来通知的时间戳不正确

Orb*_*bit 6 android broadcastreceiver alarmmanager android-notifications android-pendingintent

启动我的应用程序后,它会执行API调用,然后根据结果安排通知.这相当于约10个预定的通知.实际通知上显示的时间戳似乎存在问题.

由于我正在创建这些通知,然后使用a安排警报,AlarmManager因此通知上的默认时间将是创建通知的时间(System.currentTimeMillis()).

我试图使用.setWhen()我的方法Notification.Builder将其设置为我用来安排前面提到的警报的时间.然而,这稍微好一些,因为通知不能保证在指定的确切时间发送,我经常在过去几分钟收到通知.

另外,我尝试手动覆盖when我的通知中的字段BroadcastReceiver,在.notify()实际调用之前:

public class NotificationPublisher extends BroadcastReceiver {

    public static String NOTIFICATION_ID = "notification_id";
    public static String NOTIFICATION = "notification";

    public void onReceive(Context context, Intent intent) {

        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notification = intent.getParcelableExtra(NOTIFICATION);
        notification.when = System.currentTimeMillis();
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        notificationManager.notify(id, notification);

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在上面的场景中,似乎.when被忽略了.

坦率地说,我只是想找到一种方法,让通知上显示的时间戳是实际显示的时间.

Sam*_*y T 3

我建议将您的通知信息作为附加信息传递,然后在 BroadcastReceiver 内部构建通知。这将在发出通知之前构建通知,因此您的 AlarmManager 将同时触发 BroadcastReceiver。

从您安排通知的位置:

private void scheduleNotification(){

    // Create an intent to the broadcast receiver you will send the notification from
    Intent notificationIntent = new Intent(this, SendNotification.class);

    // Pass your extra information in
    notificationIntent.putExtra("notification_extra", "any extra information to pass in");

    int requestCode = 1;

    // Create a pending intent to handle the broadcast intent
    PendingIntent alarmIntent = PendingIntent
                .getBroadcast(this, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Set your notification's trigger time
    Calendar alarmStart = Calendar.getInstance();
    alarmStart.setTimeInMillis(System.currentTimeMillis());
    alarmStart.set(Calendar.HOUR_OF_DAY, 6); // This example is set to approximately 6am

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    // Set the alarm with the pending intent
    // be sure to use set, setExact, setRepeating, & setInexactRepeating 
    // as well as RTC_WAKEUP, ELAPSED_REALTIME_WAKEUP, etc. 
    // where appropriate
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmStart.getTimeInMillis(), alarmIntent);
}
Run Code Online (Sandbox Code Playgroud)

然后,在 BroadcastReceiver 的 onReceive 中:

String notificationExtra = null;

// Retrieve your extra data
if(intent.hasExtra("notification_extra")){
    notificationExtra = intent.getStringExtra("notification_extra");
}

//Build the notification
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
mBuilder.setSmallIcon(notificationIcon)
        .setContentTitle(notificationTitle)
        .setContentText(notificationMessage)
        .setAutoCancel(true); // Use AutoCancel true to dismiss the notification when selected

// Check if notificationExtra has a value
if(notificationExtra != null){
    // Use the value to build onto the notification
}

//Define the notification's action
Intent resultIntent = new Intent(context, MainActivity.class); // This example opens MainActivity when clicked

int requestCode = 0;

PendingIntent resultPendingIntent =
        PendingIntent.getActivity(
                context,
                requestCode,
                resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );

//Set notification's click behavior
mBuilder.setContentIntent(resultPendingIntent);

// Sets an ID for the notification
int mNotificationId = 1;

// Gets an instance of the NotificationManager service
NotificationManager mNotifyMgr =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

// Builds the notification and issues it.
mNotifyMgr.notify(mNotificationId, mBuilder.build());
Run Code Online (Sandbox Code Playgroud)