Привязка службы перед вызовом метода - PullRequest
1 голос
/ 25 января 2012

У меня проблема с привязкой сервиса к активности в Android. Проблема возникает в деятельности:

public class ServiceTestActivity extends Activity {

private static final String TAG = "ServiceTestAct";
boolean isBound = false;
TestService mService;    

public void onStopButtonClick(View v) {
    if (isBound) {
        mService.stopPlaying();
    }
}
public void onPlayButtonClick(View v) throws IllegalArgumentException, IllegalStateException, IOException, InterruptedException {
    if (isBound) {
        Log.d(TAG, "onButtonClick");
        mService.playPause();
    } else {
        Log.d(TAG, "unbound else");
        Intent intent = new Intent(this, TestService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }
}


private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        isBound = false;

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        isBound = true;         
    }
    };
}

isBound сообщает, связан ли сервис (называемый TestService) с действием. mService - это ссылка на сервис.

Теперь, если я вызываю "onPlayButton (..)" в первый раз, когда служба не привязана, вызывается bindService (..) и isBound переключается с false на true. Затем, если я снова вызываю «onPlayButton (..)», он вызывает «playPause ()» для объекта службы. Здесь все отлично работает.

Но я хочу, чтобы "playPause ()" вызывался сразу после привязки службы, поэтому я изменил свой код на это:

public void onPlayButtonClick(View v) throws IllegalArgumentException, IllegalStateException, IOException, InterruptedException {
    if (isBound) {
        Log.d(TAG, "onButtonClick");
        mService.playPause();
    } else {
        Log.d(TAG, "unbound else");
        Intent intent = new Intent(this, TestService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        mService.playPause();
    }
}

С этого момента я получаю исключение NullPointerException, поскольку mService не имеет ссылки на привязанный сервис, но все равно имеет значение null. Я проверил это, зарегистрировав значение mService в разных местах кода.

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

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Одним из решений является вызов playPause () в onServiceConnected (). Другое решение состоит в том, чтобы вызвать startService () с пользовательским намерением, которое сообщит службе, чтобы она играла. Я думаю, вы можете подумать о редизайне. Я попытался бы спроектировать сервис так, чтобы вы могли запускать и связывать сервис, когда активность запускается, и останавливать сервис, когда активность прекращается. Если вам нужен сервис, который будет оставаться активным после завершения действия, расширьте класс Application, и вы сможете запустить сервис в методе onCreate ().

2 голосов
/ 25 января 2012

Привязка службы происходит асинхронно, то есть служба может быть не привязана, если bindService () возвращается, но когда onServiceConnected () завершена. Из-за этого mService по-прежнему имеет значение null и выдается исключение. Одним из решений было бы отключить кнопку по умолчанию (в XML или onCreate ()) и включить кнопку в onServiceConnected ().

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