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()手動で開始されたものではないことを確認した後、サービス自体を停止する必要があります。

4

1 に答える 1

0

アクティビティなどの何かが呼び出されるという事実は、bindService()誰かがまだサービスにバインドされていることを意味します。stopSelf()技術的には、サービスはまだアクティビティによってバインドされているため、呼び出しによってサービスが破棄されることはありません。

unbindServiceアクティビティによって最終的に呼び出されると、破棄されます。サービスのバインドと開始は直交しています。

この設計で何を達成しようとしているのかわかりません。何かがバインドされる前にサービスを開始する理由について、より多くの情報を提供してください。

于 2012-08-13T05:33:08.000 に答える