中止服务启动

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();
    }
}