我有一项服务可以创建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
就会恢复到全职状态。
答案 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)