Android java.lang.IllegalArgumentException: служба не зарегистрирована

У меня есть настройка, которая выглядит примерно так:

class MyFragment implements SomeEventListener {

    Application mAppContext;    

    boolean mBound;
    boolean mDidCallUnbind;
    MyIBinder mBinder;
    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBound = true;
            mBinder = (MyIBinder) service;
            mBinder.getThings();...
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mDidCallUnbind = false;
            mBound = false;
            mBinder = null;
        }
    };

    ...

    @Override
    public void onSomeEvent() {
        mAppContext.bindService(...);
    }

    void unbindService() {
        if (mBound && !mDidCallUnbind) {
            mDidCallUnbind = true;
            mAppContext.unbindService(mConnection);
        }
    }

    @Override
    public void onPause() {
        unbindService();
        super.onPause();
    }
}

Тем не менее, я все еще вижу ошибку в заголовке время от времени: java.lang.IllegalArgumentException: Service not registeredгенерируется при unbindService()вызове. Я скучаю по чему-то глупому, или еще больше происходит? Я должен отметить, что может существовать более одного из этого самого фрагмента.

редактировать

Поскольку никто, по-видимому, не читает код, позвольте мне объяснить. unbindService()не вызывает, Context.unbindService(ServiceConnection)если mBound не связан ( onServiceDisconnected(...)), и он ранее не вызывался до того, как unbindService()обратный вызов был удален из предыдущего предыдущего вызова . @Override public void onCreate() { mApplication = getContext().getApplicationContext(); }

Имейте в виду, есть ли случаи, когда Android отменит ваш mIsBound для вас, так что служба станет несвязанной, но doBindService () не будет вызвана, оставив меня в устаревшем состоянии?

Кроме того, я использую свое приложение doUnbindService () для выполнения первоначальной привязки. Предположим что-то вроде:

ServiceConnection

android,android-service,android-service-binding,

27

Ответов: 5


5 принят

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

Проблема действительно связана с учебными документами. http://developer.android.com/reference/android/app/Service.html показывает правильную реализацию, а https://developer.android.com/guide/components/bound-services.html в «ActivityMessenger» показывает Очень НЕКОТОРЫЕ реализации.

В примере «ActivityMessenger» onStop () потенциально может быть вызван до того, как служба действительно была связана.

Причина этой путаницы в том, что они используют связанный сервис boolean, чтобы обозначать разные вещи в разных примерах. (в основном, bindService (), называемый OR, фактически связан с Сервисом)

В правильных примерах, где unbind () выполняется на основе значения связанного логического, связанное логическое значение указывает, что вызывалась функция bindService () . Так как это очередь на основном потоке, то ServiceConnection mConnection = новый ServiceConnection ) ( { @Override общественного аннулируются onServiceConnected ( ComponentName имя , IBinder сервис ) { mBinder = ( MyIBinder ) услуг ; } @Override общественных пустоты onServiceDisconnected ( Имя_компонент название ) { mBinder = NULL ; } }; ... public void doBindService () { bindService ( новый Intent ( это , MyService . class ), mConnection , Context . BIND_AUTO_CREATE ); mIsBound = true ; } public void doUnbindService () { if ( mIsBound ) { unbindService ( mConnection ); mIsBound = false ; } } должен быть вызван (таким образом, чтобы он выполнялся в очереди), независимо от того, когда (если когда-либо) происходит onServiceConnected ().

В других примерах, например, в http://developer.android.com/reference/android/app/Service.html . Граница указывает, что Сервисы фактически привязаны, так что вы можете использовать ее и не получить исключение NullPointerException. Обратите внимание, что в этом примере по-прежнему выполняется незарегистрированный вызов java.lang.IllegalArgumentException: Service, и связанное логическое значение не определяет, следует ли отменить привязку или нет .


20

Используйте unbindService()внутри, onSomeEvent()а unbindService()не в onPause()экземпляре.

IllegalArgumentException

Вот как это делается в http://developer.android.com/reference/android/app/Service.html


onPauseозначает, что вы не были обязаны обслуживать, когда onServiceDisconnected()его вызывали.

Так что в вашем случае Synchronizedникогда не вызывали, прежде чем звонить unbindService()вContext


0

У меня такая же проблема с моим приложением. Время от времени я получаю Context. Я предполагаю, что особый случай возникает, когда служба несвязана, а unbindServiceвызов вызывается раньше onServiceDisconnected . Поэтому я бы попробовал Serviceвсе, чтобы обеспечить правильное выполнение.


0

Другой возможной причиной этого исключения может быть то unbindService, что вызвано неправильным Service. Поскольку сервисы могут быть связаны не только с действиями, но и с другими экземплярами, унаследованными Context(за исключением BroadcastReceivers), даже другими службами, убедитесь, что unbindServiceон вызван контекстом, связавшим себя, Serviceа не самой границей Service. Это дало бы прямое исключение «Служба не зарегистрирована».

андроид, андроид-сервис, андроид-сервис связывания,
Похожие вопросы