Что происходит с объектом службы после его уничтожения

Допустим, я привязался к службе и получил ссылку на нее через объект IBinder. Я храню ссылку в своем объекте Activity как поле. Затем я отвязываю службу, вызывая ее уничтожение. К чему относится ссылка на Службу в Деятельности после уничтожения Службы?


person f.khantsis    schedule 27.04.2015    source источник
comment
вы получаете мертвый объект   -  person pskink    schedule 27.04.2015


Ответы (1)


Ничего. Это классическое не связанное состояние, и если вы получите к нему доступ, поведение будет непредсказуемым, но никогда не будет хорошим.

=====

Обновить

Посмотрите на этот пример (взято из здесь):

public class BindingActivity extends Activity {
LocalService mService;
boolean mBound = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override
protected void onStart() {
    super.onStart();
    // Bind to LocalService
    Intent intent = new Intent(this, LocalService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}

/** Called when a button is clicked (the button in the layout file attaches to
  * this method with the android:onClick attribute) */
public void onButtonClick(View v) {
    if (mBound) {
        // Call a method from the LocalService.
        // However, if this call were something that might hang, then this request should
        // occur in a separate thread to avoid slowing down the activity performance.
        int num = mService.getRandomNumber();
        Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
    }
}

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

}

Обратите внимание на Сервисное соединение.

person Royi Benyossef    schedule 27.04.2015
comment
Есть ли способ проверить, не выходит ли он за пределы? - person f.khantsis; 27.04.2015
comment
На самом деле нет, вам все равно никогда не следует сохранять экземпляр в IBinder, и вы можете просто использовать логический флаг, чтобы указать, привязаны вы или нет. - person Royi Benyossef; 27.04.2015
comment
Не следует сохранять экземпляр? Итак, как мне позже связаться со службой, к которой я привязан? - person f.khantsis; 27.04.2015
comment
Хорошо, я думаю, что теперь я лучше понимаю ваш вопрос, обновляю свой ответ - пожалуйста, посмотрите. - person Royi Benyossef; 27.04.2015
comment
Хорошо спасибо. Слушайте, это немного не по теме, но я только сейчас начинаю Android-разработку и это очень запутанно, хотя я приличный Java-программист. Можете ли вы порекомендовать мне действительно хороший учебник/пример программы для оплаты/что-нибудь, чтобы облегчить обучение? - person f.khantsis; 27.04.2015