关闭我的应用程序时,我的服务似乎重新启动

时间:2015-06-07 11:26:34

标签: android android-service

我有一项服务可以创建CountDownTimer,然后显示Notification并根据CountDownTimer对其进行更新。

当我关闭应用程序时出现问题。即使CountDownTimer已完成一半,也会在应用完全关闭时重置。

这是Service cass的主要部分:

/*
Variables
 */

private NotificationManager notificationManager;

private CountDownTimer countDownTimer;

private String TAG = "NotificationService";

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

private int reservationDuration;

/*
Callbacks
 */

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

    notificationManager =
            (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    EventBus.getDefault().register(this);
    reservationDuration = 15;
}

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

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

    countDownTimer = new CountDownTimer(1000 * 60 * 15, 1000 * 60) {

        @Override
        public void onTick(long millisUntilFinished) {
            notificationManager.notify(NOTIFICATION_COUNTDOWN, createReservationActiveNotification(--reservationDuration));
        }

        @Override
        public void onFinish() {
            notificationManager.cancel(NOTIFICATION_COUNTDOWN);
            stopSelf();
        }
    }.start();

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

每当应用关闭时,Service似乎都会完全重启。因为即使 reservationDuration 变量也会重置为15(whcih在onCreate中),并且只要应用程序被完全销毁/关闭,Notification就会恢复到全职状态。

1 个答案:

答案 0 :(得分:1)

从onStartCommand的覆盖中返回的值决定了服务在被杀死时会发生什么,例如当你的应用被杀死时需要更多的内存。

如果您返回START_NOT_STICKY,您的服务在被杀之后将不会重新启动,直到您通过启动命令显式启动它。

因为你要归还super.onStartCommand(intent, flags, startId); 您将获得START_STICKY或START_STICKY_COMPATIBILITY的默认值。这里记录了:

public int onStartCommand (Intent intent, int flags, int startId)
  

在API级别5中添加每次客户端由系统调用   通过调用startService(Intent)显式启动服务,   提供它提供的参数和唯一的整数标记   代表开始请求。不要直接调用此方法。

     

为了向后兼容,默认实现调用   onStart(Intent,int)并返回START_STICKY或   START_STICKY_COMPATIBILITY。

以下是onStartCommand(来自文档)的各种返回值的详细信息。

  

public static final int START_CONTINUATION_MASK

     

在API级别5中添加onStartCommand返回的位(Intent,int,int)   描述如果它被杀死,如何继续服务。也许   START_STICKY,START_NOT_STICKY,START_REDELIVER_INTENT或   START_STICKY_COMPATIBILITY。

     

常量值:15(0x0000000f)public static final int   START_FLAG_REDELIVERY

     

在API级别5中添加此标志在onStartCommand中设置(Intent,int,   int)如果Intent是先前交付的意图的重新交付,   因为该服务之前已经返回START_REDELIVER_INTENT但是   在为Intent调用stopSelf(int)之前已被杀死。

     

常量值:1(0x00000001)public static final int   START_FLAG_RETRY

     

在API级别5中添加此标志在onStartCommand中设置(Intent,int,   int)如果Intent是重试,因为原始尝试从未得到   从onStartCommand(Intent,int,int)返回或返回。

     

常量值:2(0x00000002)public static final int   START_NOT_STICKY

     

在API级别5中添加从onStartCommand返回的常量(Intent,   int,int):如果此服务的进程在启动时被终止   (从onStartCommand(Intent,int,int)返回后),有   没有新的开始意图交付它,然后服务出来   启动状态并且不会重新创建,直到将来显式调用   Context.startService(意图)。该服务不会收到   onStartCommand(Intent,int,int)调用null Intent,因为它   如果没有待处理的意图交付,则不会重新启动。

     

这种模式对于想要做一些工作的事情是有意义的   启动时,但在内存压力下可以停止   将在以后再次明确地开始自己做更多的工作。一个例子   这样的服务将是一个从服务器轮询数据的服务:它   可以通过发出警报来安排警报每N分钟轮询一次   开始服务。当它的onStartCommand(Intent,int,int)被调用时   从警报开始,它会在N分钟后安排一个新警报,并且   产生一个线程来做它的网络。如果它的进程被杀死了   执行该检查,该服务将不会重新启动,直到警报   走了。

     

常量值:2(0x00000002)public static final int   START_REDELIVER_INTENT

     

在API级别5中添加从onStartCommand返回的常量(Intent,   int,int):如果此服务的进程在启动时被终止   (从onStartCommand(Intent,int,int)返回后),然后它会   计划重新启动,最后交付的Intent重新交付   通过onStartCommand(Intent,int,int)再次访问它。这个意图会   保持计划重新发送,直到服务调用stopSelf(int)   使用提供给onStartCommand(Intent,int,int)的起始ID。该   service不会收到onStartCommand(Intent,int,int)调用   一个null Intent,因为它只会被重新启动   已完成处理发送给它的所有意图(以及任何此类待处理的意图   事件将在重新启动时发送。)

     

常量值:3(0x00000003)public static final int START_STICKY

     

在API级别5中添加从onStartCommand返回的常量(Intent,   int,int):如果此服务的进程在启动时被终止   (从onStartCommand(Intent,int,int)返回后),然后保留它   处于启动状态但不保留此意图。后来的   系统将尝试重新创建服务。因为它是在开始   state,它将保证调用onStartCommand(Intent,int,int)   创建新服务实例后;如果没有任何待处理的   启动要传递给服务的命令,将调用它   一个空的intent对象,所以你必须注意检查这个。

     

此模式适用于将明确启动的内容   停止运行任意时间段,例如服务   表演背景音乐播放。

     

常量值:1(0x00000001)public static final int   START_STICKY_COMPATIBILITY

     

在API级别5中添加从onStartCommand返回的常量(Intent,   int,int):START_STICKY的兼容版本没有   保证再次调用onStartCommand(Intent,int,int)   被杀后。

     

常数值:0(0x00000000)