中止服务启动
Abort service start
我有一个 Android 应用程序,其服务可以连接到外围设备并监听其输出。与外设的连接在服务的 onStartCommand()
方法中启动。
建立连接涉及多个“希望”,有时可能会因异常而失败。
如何防止服务成为 运行 但没有连接可监控的僵尸?从 onStartCommand()
中调用 stopSelf()
似乎不起作用。
粗略代码:
public int onStartCommand(Intent intent, int flags, int startId) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
stopSelf();
}
return START_REDELIVER_INTENT;
}
我通过将连接代码移动到 AsyncTask
并在连接失败时从那里停止服务来解决它。
由于 onStartCommand()
在 UI 线程上运行并且连接到设备可能需要一些时间,因此通过将其放入 AsyncTask
中将其从 UI 线程中删除反正比较干净。
简化代码:
public int onStartCommand(Intent intent, int flags, int startId) {
StartupTask startupTask = new StartupTask();
startupTask.execute();
return START_REDELIVER_INTENT;
}
private class StartupTask extends AsyncTask<Void, Void, Void> {
boolean success = true;
@Override
protected Void doInBackground(Void... params) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
success = false;
}
}
@Override
protected void onPostExecute(Void result) {
if (!success)
stopSelf();
}
}
我有一个 Android 应用程序,其服务可以连接到外围设备并监听其输出。与外设的连接在服务的 onStartCommand()
方法中启动。
建立连接涉及多个“希望”,有时可能会因异常而失败。
如何防止服务成为 运行 但没有连接可监控的僵尸?从 onStartCommand()
中调用 stopSelf()
似乎不起作用。
粗略代码:
public int onStartCommand(Intent intent, int flags, int startId) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
stopSelf();
}
return START_REDELIVER_INTENT;
}
我通过将连接代码移动到 AsyncTask
并在连接失败时从那里停止服务来解决它。
由于 onStartCommand()
在 UI 线程上运行并且连接到设备可能需要一些时间,因此通过将其放入 AsyncTask
中将其从 UI 线程中删除反正比较干净。
简化代码:
public int onStartCommand(Intent intent, int flags, int startId) {
StartupTask startupTask = new StartupTask();
startupTask.execute();
return START_REDELIVER_INTENT;
}
private class StartupTask extends AsyncTask<Void, Void, Void> {
boolean success = true;
@Override
protected Void doInBackground(Void... params) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
success = false;
}
}
@Override
protected void onPostExecute(Void result) {
if (!success)
stopSelf();
}
}