我已阅读this回答,但在我的案例中没用。
我创建了一个简单的服务,它只会记录方法名称。我从我的活动中运行它并使用
杀死它adb shell am stopservice -n serviceComponent
服务时调用 onDestroy()
。现在我从Service.START_STICKY
返回了onStartCommand()
;我等待系统重启
该服务并且从不重新启动。
这是正确的行为吗?我已经解决了this问题,但无法找到可靠的答案。
public class SampleService extends Service {
private static final boolean LOG = true;
public static final String CALLER = "sample.service.caller";
/**
* called once when service is created.
*/
@Override
public void onCreate() {
super.onCreate();
if(LOG){
log("onCreate() -> thread: %s", Thread.currentThread().getName());
}
} // onCreate
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(LOG){
log(">>>>>> onStartCommand()");
}
if(LOG){
log("thread: %s", Thread.currentThread().getName());
}
if(LOG){
log("caller[%s]", intent.getStringExtra(CALLER));
}
if(LOG){
log("<<<<<< onStartCommand()");
}
return Service.START_STICKY;
} // onStartCommand
@Override
public void onDestroy() {
super.onDestroy();
if(LOG){
log("onDestroy() -> thread: %s", Thread.currentThread().getName());
}
Toast.makeText(this, "destroying", Toast.LENGTH_SHORT).show();
} // onDestroy
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
} // onBind
private void log(String format, Object... args){
Utils.log("SampleService", String.format(format, args));
} // log
} // SampleService
这是我到目前为止所尝试的内容
我通过使用此代码
来启动服务 Intent intent = new Intent(this, SampleService.class);
intent.putExtra(SampleService.CALLER, "main activity");
if(null == startService(intent)){
if(LOG){
log("startService -> %s", "service not found!");
}
} //
启动服务后,adb shell dumpsys activity services | grep "com.mallaudin"
会返回此
ServiceRecord{8bc884d u0 com.mallaudin.services/.SampleService}
intent={cmp=com.mallaudin.services/.SampleService}
packageName=com.mallaudin.services
processName=com.mallaudin.services
baseDir=/data/app/com.mallaudin.services-2/base.apk
dataDir=/data/user/0/com.mallaudin.services
app=ProcessRecord{b1c1c5a 32017:com.mallaudin.services/u0a94}
现在我通过调用adb shell am stopservice -n com.mallaudin.services/.SampleService
来停止服务。它会停止服务并且onDestroy
是
调用。当我从手机中的服务列表中终止服务时,会发现相同的行为。
Stopping service: Intent { cmp=com.mallaudin.services/.SampleService }
Service stopped
当我使用adb shell force-stop com.mallaudin.services
命令时,服务已停止,但未调用onDestroy()
。
答案 0 :(得分:1)
START_STICKY
文档:
...如果此服务的进程在启动时被终止......
context.stopService(Intent)
和Activity
实际上并没有终止服务进程,而只是在保持应用程序进程运行的同时停止服务。因此,在这种情况下系统不会重启服务。
您可以尝试以下操作:创建一个包含Service
和^\/projects*
的应用。然后启动活动,启动服务,并通过从概览屏幕(也就是最近的菜单)滑动来杀死应用程序。您的服务应该重新启动。