中止服务开始

时间:2017-07-29 21:21:55

标签: android android-service

我有一个Android应用程序,其服务连接到外围设备并监听其输出。与外围设备的连接是在服务的onStartCommand()方法中启动的。

建立连接涉及几个“有希望”,有时可能会因例外而失败。

如何防止服务成为正在运行但与监视器无关的僵尸?从stopSelf()内拨打onStartCommand()似乎不起作用。

粗略代码:

public int onStartCommand(Intent intent, int flags, int startId) {
    try {
        // connect to device
    } catch (ConnectToDeviceException e) {
        stopSelf();
    }
    return START_REDELIVER_INTENT;
}

1 个答案:

答案 0 :(得分:1)

我通过将连接代码移动到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();
    }
}