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中引入各种标志之前,所有服务都是这样工作的。