【发布时间】:2017-01-17 14:39:16
【问题描述】:
我有一个简单的服务:
public class TestService extends Service {
final String LOG_TAG = "myLogs";
public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "TestService onCreate");
}
public void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "TestService onDestroy");
}
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_TAG, "TestService onStartCommand")
readFlags(flags);
MyRun mr = new MyRun(startId);
new Thread(mr).start();
return START_REDELIVER_INTENT;
}
public IBinder onBind(Intent arg0) {
return null;
}
void readFlags(int flags) {
switch (flags) {
case START_FLAG_REDELIVERY:
Log.d(LOG_TAG, "START_FLAG_REDELIVERY");
break;
case START_FLAG_RETRY:
Log.d(LOG_TAG, "START_FLAG_RETRY");
break;
default:
Log.d(LOG_TAG, "Flag: " + flags);
}
}
class MyRun implements Runnable {
int startId;
public MyRun(int startId) {
this.startId = startId;
Log.d(LOG_TAG, "Run#" + startId + " create");
}
public void run() {
Log.d(LOG_TAG, "Run#" + startId + " start");
try {
TimeUnit.SECONDS.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
stop();
}
void stop() {
Log.d(LOG_TAG, "Run#" + startId + " end, stopSelfResult("
+ startId + ") = " + stopSelfResult(startId));
}
}
如果我理解正确,标记 START_REDELIVER_INTENT 应该尽快重新启动我的服务,因为有足够的可用内存。 但是(我已经在 3 台设备(4.1.2、4.4.2 和 6.0.1)上检查过)当我终止 proc 时,服务仅在其中 1 台(4.1.2)上重新启动:
D/myLogs: TestService onCreate
D/myLogs: TestService onStartCommand
D/myLogs: START_FLAG_REDELIVERY
D/myLogs: MyRun#1 create
D/myLogs: MyRun#1 start
D/myLogs: MyService onDestroy
D/myLogs: MyRun#1 end, stopSelfResult(1) = true
另外两个设备有什么问题? 其他标志也有同样的问题,例如START_STICKY - 服务进程永久终止。
【问题讨论】:
-
这些设备的品牌和型号是什么?一些制造商已经设置了限制,不允许服务留在后台,比如华为