我在前台运行服务.有时它会被终止,大概是出于内存的原因(尽管我对LogCat日志并不是100%肯定).已终止的其他服务计划在5000毫秒内重新启动,但查看日志,我的服务重新启动时间很长,例如:
11-15 15:39:48.756: W/ActivityManager(375): Scheduling restart of crashed service com.example.app/com.example.SensorService in 1019562ms
Run Code Online (Sandbox Code Playgroud)
有什么可以解释这个?如何设置重启间隔?我已经看到一些建议,通知服务重新启动时延迟较短,但我的服务确实有通知.
aus*_*len 14
来自com/android/server/am/ActiveServices.java(未公开)
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000;
// How long a service needs to be running until restarting its process
// is no longer considered to be a relaunch of the service.
static final int SERVICE_RESTART_DURATION = 5*1000;
// How long a service needs to be running until it will start back at
// SERVICE_RESTART_DURATION after being killed.
static final int SERVICE_RESET_RUN_DURATION = 60*1000;
// Multiplying factor to increase restart duration time by, for each time
// a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
static final int SERVICE_RESTART_DURATION_FACTOR = 4;
// The minimum amount of time between restarting services that we allow.
// That is, when multiple services are restarting, we won't allow each
// to restart less than this amount of time from the last one.
static final int SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
// Maximum amount of time for there to be no activity on a service before
// we consider it non-essential and allow its process to go on the
// LRU background list.
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
Run Code Online (Sandbox Code Playgroud)
你发生的事情可能是你的服务快死了SERVICE_RESET_RUN_DURATION然后重启时间乘以SERVICE_RESTART_DURATION_FACTOR.
从第881行开始:
// If it has been a "reasonably long time" since the service
// was started, then reset our restart duration back to
// the beginning, so we don't infinitely increase the duration
// on a service that just occasionally gets killed (which is
// a normal case, due to process being killed to reclaim memory).
if (now > (r.restartTime+resetTime)) {
r.restartCount = 1;
r.restartDelay = minDuration;
} else {
if ((r.serviceInfo.applicationInfo.flags
&ApplicationInfo.FLAG_PERSISTENT) != 0) {
// Services in peristent processes will restart much more
// quickly, since they are pretty important. (Think SystemUI).
r.restartDelay += minDuration/2;
} else {
r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR;
if (r.restartDelay < minDuration) {
r.restartDelay = minDuration;
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面的行将支持您的服务.
r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR;
Run Code Online (Sandbox Code Playgroud)
因此,如果您的服务在运行之前死亡,您应该修复此案例SERVICE_RESET_RUN_DURATION.
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |