2012-05-26 4 views
2

Я создал сервис, который можно запустить с помощью метода startService(), но он также будет связан приложениями. Я хочу, чтобы его можно было запустить только с помощью метода startService(), или, другими словами, приложения должны иметь возможность привязываться к нему только тогда, когда служба уже запущена.Как убедиться, что услугу можно запустить только вручную?

  1. Службу следует запускать вручную, а не когда приложение связывается с ней.
  2. Если служба запущена, приложения могут привязываться к ней.
  3. Если служба не запущена, когда приложение пытается привязываться к ней, служба не запускается.

Однако поведение по умолчанию совсем другое: на самом деле Android запускает службу автоматически, когда приложение хочет привязываться к ней. Я хотел бы знать, возможно ли изменить это поведение для достижения вышеуказанного требования.

Если это невозможно, единственной альтернативой может стать остановка службы, если она была инициирована в результате bindService(). Вот изменения в мой класс обслуживания для того, чтобы использовать этот путь ...

// It says if the service was started manually. 
private boolean mCorrectlyStarted = false; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i(LOG_TAG, "onStartCommand()"); 
    mCorrectlyStarted = true; // the service is started manually: ok! 
    return START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    Log.i(LOG_TAG, String.format("onBind(intent: %s)", intent)); 

    if (mCorrectlyStarted) { 
     return binder; 
    } 
    else { 
     stopSelf(); // although I make this call, the service is not stopped 
     return null; 
    } 
} 

Почему мои изменения не имеют желаемый эффект? Может случиться так, что служба запускается, когда приложение вызывает метод bindService(), но после проверки того, что он не запускался вручную, он должен остановиться.

ответ

0

Тот факт, что что-то, как Activity, называется bindService(), означает, что кто-то все еще связан с сервисом. Вызов stopSelf() не разрушает службу, так как технически служба по-прежнему связана действительностью.

Он будет уничтожен, как только unbindService будет вызван в конечном итоге Activity. Связывание и запуск службы ортогональны.

Я не уверен, чего вы пытаетесь достичь с помощью этого дизайна, может быть, больше информации о том, почему вы хотите, чтобы служба запускалась, прежде чем что-то может с ней связать?

Смежные вопросы