我的应用使用了一种模式,在这种模式下我使用Context#startService()开始了一项服务,并使用Context#bindService()进行绑定。这样我就可以独立于任何客户端是否与其绑定来控制服务的生命周期。不过,我最近注意到,无论何时我的应用程序被系统杀死,它很快就会重新启动任何正在运行的服务。在这一点上,服务将永远不会被告知停止,并且这会导致电池耗尽。这是一个最简单的例子:
我找到了一个here类似问题的人,但它并没有被诊断或解决。
服务:
@Override
public void onCreate() {
Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}活动:
@Override
protected void onStart() {
super.onStart();
Intent service = new Intent(this, BoundService.class);
startService(service);
bindService(service, mServiceConnection, 0);
}
@Override
protected void onStop() {
unbindService(mServiceConnection);
Toast.makeText(this, "unbindService", Toast.LENGTH_SHORT).show();
super.onStop();
}为了测试它,我启动了应用程序,该应用程序启动了服务并绑定到该应用程序。然后我退出了应用程序,解除绑定(但保持服务运行)。然后我做到了
$ adb shell am kill com.tavianator.servicerestart并且果然,5秒钟后,出现“onCreate”吐司,表示服务再次开始。 Logcat显示了这一点:
$ adb logcat | grep BoundService
W/ActivityManager( 306): Scheduling restart of crashed service com.tavianator.servicerestart/.BoundService in 5000ms
I/ActivityManager( 306): Start proc com.tavianator.servicerestart for service com.tavianator.servicerestart/.BoundService: pid=20900 uid=10096 gids={1028}如果我将startService()模式替换为BIND_AUTO_CREATE,则问题不会发生(即使我在应用程序仍然绑定到服务时崩溃)。如果我从不与服务绑定,它也可以工作。但是,开始,绑定和解除绑定的组合似乎永远不会让我的服务死亡。
杀死应用程序之前使用dumpsys显示:
$ adb shell dumpsys activity services com.tavianator.servicerestart
ACTIVITY MANAGER SERVICES (dumpsys activity services)
Active services:
* ServiceRecord{43099410 com.tavianator.servicerestart/.BoundService}
intent={cmp=com.tavianator.servicerestart/.BoundService}
packageName=com.tavianator.servicerestart
processName=com.tavianator.servicerestart
baseDir=/data/app/com.tavianator.servicerestart-2.apk
dataDir=/data/data/com.tavianator.servicerestart
app=ProcessRecord{424fb5c8 20473:com.tavianator.servicerestart/u0a96}
createTime=-20s825ms lastActivity=-20s825ms
executingStart=-5s0ms restartTime=-20s825ms
startRequested=true stopIfKilled=true callStart=true lastStartId=1
Bindings:
* IntentBindRecord{42e5e7c0}:
intent={cmp=com.tavianator.servicerestart/.BoundService}
binder=android.os.BinderProxy@42aee778
requested=true received=true hasBound=false doRebind=false