如何确保只能手动启动服务?

时间:2012-05-26 00:09:05

标签: android android-service android-2.3-gingerbread

我创建了一个可以通过startService()方法启动的服务,但它也受应用程序的约束。我希望它只能通过startService()方法启动,换句话说,只有在服务已经启动时,应用程序才能绑定到它。

  1. 应该手动启动服务,而不是应用程序绑定服务时。
  2. 如果服务正在运行,应用程序可以绑定到它。
  3. 如果服务未运行,则当应用程序尝试绑定到该服务时,该服务不应启动。
  4. 但是,默认行为完全不同:事实上,当应用程序想要绑定它时,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;
       }
    }
    

    为什么我的更改没有达到预期的效果? 当应用程序调用{​​{1}}方法时,服务启动可能会很好,但在验证它没有手动启动后,它应该自行停止。

1 个答案:

答案 0 :(得分:0)

事件,如活动,称为bindService(),意味着某人仍然受到服务的约束。调用stopSelf()不会破坏服务,因为从技术上讲,服务仍受活动约束。

一旦活动最终调用unbindService,它将被销毁。绑定和启动服务是正交的。

我不确定您尝试使用此设计实现的目标,可能会提供更多信息,说明为什么您希望在某些内容可以绑定之前启动该服务?