Сервис Android можно привязать без запуска? - PullRequest
4 голосов
/ 28 апреля 2011

Во многих статьях, руководствах и документах до сих пор читалось, что мы вызываем startService () или bindService (), обе запускают службу. Мы можем также назвать оба, но это другая история. Я не могу bindService без startService ().

    private void bindTunManagerService(int flags) {
    TunnelManagerService.setParentActivity(this);
    Intent bindIntent = new Intent(this, TunnelManagerService.class);
    startService(bindIntent);
    tunManagerServiceStarted = bindService(bindIntent, tunConnection, BIND_AUTO_CREATE);

    Log.d(TAG, "tunManagerServiceStarted  : " + tunManagerServiceStarted + ", ** tunManagerService = " + tunManagerService );

В приведенном выше коде, если я комментирую startService (), bindService возвращает false и tunManagerService = null, даже onServiceConnected не запускается, и я получаю сообщение «Невозможно передать намерение службы {...} не найдено». После добавления startService сервисы onCreate, onStart, onServiceConnected вызываются и успешно ограничиваются.

При практическом использовании необходимо сначала запуститьServie, а затем только мы можем bindService (). Это означает, что без startSErvice мы не сможем привязать сервис !! Если это утверждение неверно, почему я не могу bindService без его запуска?

Любые идеи ????

КОД ДОБАВЛЕН

ServiceConnection:

    private ServiceConnection tunConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG,"onServiceConnected" );
        tunManagerService = ITunnelManagerService.Stub.asInterface(service);
        doConnect();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG,"onServiceDisconnected" );
        tunManagerService = null;
    }

};

Услуга:

public class TunnelManagerService extends Service {
@Override
public IBinder onBind(Intent arg0) {
    return binder;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "TunnelManagerService: onCreate");
    setCreatedPreference(true);
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Received start id " + startId + ": " + intent);
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    setCreatedPreference(false);
    hideNotifConnected();
    Log.d(TAG, "TunnelManagerService: onDestroy");
}

private final ITunnelManagerService.Stub binder = new ITunnelManagerService.Stub() {
  // contains all methods
}

...............
.............

}

Манифест:

        <activity android:name=".StartUltimate" android:label="@string/app_name" 
         android:launchMode="singleTask" android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name="orange.android.vpn.utilities.TunnelManagerService" android:enabled="true"></service>

Я использую 2.3.3 SDK, т.е. API 10. Моя деятельность, с которой я звоню, находится в "orange.android.vpn", а файлы, относящиеся к сервису, находятся в пакетах "orange.android.vpn.utilities" соответственно.

Ответы [ 2 ]

10 голосов
/ 12 мая 2011

Я нашел решение, поэтому делюсь со всеми вами.

Существует 2 типа услуг: один, где вы начинаете и останавливаетесь. Это может быть запущено и остановлено только один раз в приложении. Другие вы связываете и отменяете привязку по мере необходимости N раз. Мой сервис второго типа. Но просто связать и развязать не делает работу. Служба сначала должна быть запущена, затем только она может быть связана и не связана. Так что при запуске приложения или там, где это уместно, Запустите службу. Затем связывайте при необходимости. Когда надеешься с этим, развяжи это. Этот круг Bind-Unbind может продолжаться. И наконец, когда вы уверены, что вам это не нужно или в конце приложения остановите службу. Таким образом, поток приходит как Пуск -> Связать -> Отменить -> Стоп <- </p>

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 18 января 2014

Да.

bindService(new Intent(this, MyService.class), mConnection, 0);

AFAIK, это всегда будет возвращать true (при условии, что с MyService нет проблем)

Существует два сценария:

  1. Служба ранее была запущена - функция mConnection onServiceConnected () называется
  2. Служба ранее НЕ была запущена - функция onConserctionConnected () mConnection НЕ вызывается, и служба НЕ запускается.Однако, как только служба запускается (каким-либо другим способом), onServiceConnected () затем вызывается

На практике, когда я вызываю этот метод, я предполагаю, что служба не запускается до тех пор, покаМетод onServiceConnected () вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...