Android: как получить контекст вызова активности в IntentService?

если я позвоню

Intent intent = new Intent(ReadingActivity.this, AdService.class);
startService(intent);       

из метода onCreate класса MyActivity, как мне получить доступ к MyActivity.this из метода onHandleIntent() класса IntentService

@Override
protected void onHandleIntent(Intent arg0) {
    // TODO Auto-generated method stub
    ((BookLib) getApplication()).createAd(I need to pass the calling activities context here);
}

person jamesc    schedule 30.07.2012    source источник


Ответы (2)


как получить доступ к MyActivity.this из метода onHandleIntent класса IntentService

Вы не знаете.

Переместите createAd() в действие. Если время является проблемой, используйте AsyncTask, а не IntentService.

IntentService в основном подходит для тех случаев, когда вы хотите, чтобы работа продолжалась независимо от любого действия (например, загрузка файла, которая должна продолжаться, даже если пользователь покидает ваш пользовательский интерфейс, чтобы заняться чем-то другим).

person CommonsWare    schedule 30.07.2012
comment
Спасибо. Думаю, мне нужно изучить AsyncTask - person jamesc; 30.07.2012
comment
Этот ответ - хороший совет в этом случае - история с молотком и гвоздем. Тем не менее, если вам нужен доступ к контексту (возможно, к экземпляру действия), getApplicationContext() — это доступно. Я думаю, что даже из IntentService есть случаи, когда это имеет смысл. Например, чтобы получить системные службы (например, context.getSystemService(Context.ALARM_SERVICE);). - person Eric Platon; 25.02.2016

Мне кажется, что вы пытаетесь установить двустороннюю связь со своими Activity и Service. Вместо того, чтобы отправлять Intent в свою службу, рассмотрите возможность привязки к ней. вместо.

РЕДАКТИРОВАТЬ: отвечая на комментарии CommonsWare:

Где проблема с привязкой к IntentService? Я отправил приложения, которые отлично работают и содержат связанный IntentService. Вы не предоставили никаких доказательств, подтверждающих ваше утверждение.

Из здесь:

Служба может быть как запущена, так и иметь привязанные к ней соединения. В таком случае система будет поддерживать работу службы до тех пор, пока она запущена или к ней есть одно или несколько подключений с флагом Context.BIND_AUTO_CREATE. Если ни одна из этих ситуаций не выполняется, вызывается метод службы onDestroy(), и служба эффективно завершается. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возвращения из onDestroy().

В документах четко указано, что система поддерживает одновременную привязку и запуск. Использование IntentService вместо обычного Service не меняет этого. Даже если вы явно остановите службу после обработки Intent, Android оставит ее работающей до тех пор, пока с ней что-то связано.

Кроме того, в зависимости от того, что пытается сделать OP, IntentService может больше не понадобиться.

person Aaron Klotz    schedule 30.07.2012
comment
Binding и IntentServices плохо сочетаются. С привязкой к обычным сервисам все в порядке, и отправка команд на IntentServices (через startService()) тоже работает. - person CommonsWare; 30.07.2012
comment
Где проблема с привязкой к IntentService? -- в лучшем случае это будет работать только в том случае, если вы сначала выполните привязку, прежде чем вызывать startService(). В противном случае вы получите условия гонки, в которых onHandleIntent() завершается до того, как произойдет привязка, в результате чего первый экземпляр IntentService будет уничтожен (через stopSelf()), а привязка произойдет во втором. ИМХО, если вы думаете, что хотите привязаться к IntentService, вам действительно следует привязаться к обычному Service и просто управлять своим собственным фоновым потоком. - person CommonsWare; 31.07.2012