Android 服务丢失它';系统重新启动时的目的

Android 服务丢失它';系统重新启动时的目的,android,android-intent,android-service,Android,Android Intent,Android Service,我正在开始一项服务如下: Intent intentService = new Intent(getActivity(), ACNotificationService.class); intentService.putExtra("ACReservation", reservationActivity.acReservation); getActivity().startService(intentService); 这是我的服务课程: /* Variables */ private No

我正在开始一项
服务
如下:

Intent intentService = new Intent(getActivity(), ACNotificationService.class);
intentService.putExtra("ACReservation", reservationActivity.acReservation);
getActivity().startService(intentService);
这是我的
服务
课程:

/*
Variables
 */

private NotificationManager notificationManager;

private CountDownTimer countDownTimer;

private static int NOTIFICATION_COUNTDOWN = 0;
private static int NOTIFICATION_RANOUT = 1;

private ACReservation acReservation;

/*
Callbacks
 */

@Override
public void onCreate() {
    super.onCreate();

    // Initialize variables
    notificationManager =
            (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);

    // Register EventBus
    EventBus.getDefault().register(this);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    // Get reservation data from extras
    if (acReservation == null) {
        acReservation = (ACReservation) intent.getExtras().get("ACReservation");
    }

    // Start timer
    countDownTimer = new CountDownTimer(acReservation.getRemainingMilliseconds(), 100) {

        @Override
        public void onTick(long millisUntilFinished) {
            // Update/Show notification
            notificationManager.notify(NOTIFICATION_COUNTDOWN, createReservationActiveNotification((int)TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
        }

        @Override
        public void onFinish() {
            // Clear notifications
            notificationManager.cancel(NOTIFICATION_COUNTDOWN);

            // Stop service
            stopSelf();
        }
    }.start();

    return super.onStartCommand(intent, flags, startId);
}

/*
Methods
 */

public Notification createReservationActiveNotification(int expInMinutes) {
    Notification.Builder notification = new Notification.Builder(getApplicationContext());
    notification.setContentTitle("Reservation");
    notification.setContentText("Your reservation expires in " + expInMinutes + " minutes");
    notification.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
    notification.setSmallIcon(R.drawable.car_icon);
    notification.setOngoing(true);
    notification.setPriority(Notification.PRIORITY_MAX);
    notification.setOnlyAlertOnce(true);
    return notification.build();
}

public void onEvent(ACEventBusButtonClick buttonClick) {
    if (buttonClick.getButtonAction() != null) {
        if (buttonClick.getButtonAction().equals(ACEventBusButtonClick.BUTTON_CANCEL_RESERVATION)) {
            notificationManager.cancel(NOTIFICATION_COUNTDOWN);
            countDownTimer.cancel();
            stopSelf();
        }
    }
}
这很简单。我将对象从
Intent
中取出,并使用它来计算毫秒。然后我启动一个新的
倒计时程序
,它不断更新
通知

直到系统重新启动
服务
,它才会正常工作。它会丢失它的
意图
额外数据,并在重新启动时在这一行代码处崩溃:

if (acReservation == null) {
    acReservation = (ACReservation) intent.getExtras().get("ACReservation");
}
日志显示它崩溃是因为
Intent
null
。因此,当重新启动
服务时,我正在对空对象调用
getExtras()

如何修复此问题?

onStartCommand()
返回,而不是返回默认值的超级调用

,int,int)

onStartCommand()
返回,而不是返回默认值的超级调用

,int,int)

onStartCommand()
返回,而不是返回默认值的超级调用

,int,int)

onStartCommand()
返回,而不是返回默认值的超级调用


,int,int)

这不是默认行为吗?我是说,为什么有人不想重新交付意向书?非常感谢你的回答!医生说“向后兼容”,这是一个相当大的俱乐部,几乎意味着任何事情。这完全取决于
服务的语义。也许您有一个半完成的服务,它以其他方式保存状态,并希望从它剩下的地方开始,您可以对交付的意图使用空检查来确定它是新调用还是必须选择旧调用。也许在api级别5中引入各种标志之前,所有服务都是这样工作的。这难道不是默认行为吗?我是说,为什么有人不想重新交付意向书?非常感谢你的回答!医生说“向后兼容”,这是一个相当大的俱乐部,几乎意味着任何事情。这完全取决于
服务的语义。也许您有一个半完成的服务,它以其他方式保存状态,并希望从它剩下的地方开始,您可以对交付的意图使用空检查来确定它是新调用还是必须选择旧调用。也许在api级别5中引入各种标志之前,所有服务都是这样工作的。这难道不是默认行为吗?我是说,为什么有人不想重新交付意向书?非常感谢你的回答!医生说“向后兼容”,这是一个相当大的俱乐部,几乎意味着任何事情。这完全取决于
服务的语义。也许您有一个半完成的服务,它以其他方式保存状态,并希望从它剩下的地方开始,您可以对交付的意图使用空检查来确定它是新调用还是必须选择旧调用。也许在api级别5中引入各种标志之前,所有服务都是这样工作的。这难道不是默认行为吗?我是说,为什么有人不想重新交付意向书?非常感谢你的回答!医生说“向后兼容”,这是一个相当大的俱乐部,几乎意味着任何事情。这完全取决于
服务的语义。也许您有一个半完成的服务,它以其他方式保存状态,并希望从它剩下的地方开始,您可以对交付的意图使用空检查来确定它是新调用还是必须选择旧调用。也许在api级别5中引入各种标志之前,所有服务都是这样工作的。