2013-01-20 4 views
1

Привет и спасибо за помощь.Как избежать остановки службы при изменении конфигурации?

У меня есть следующая ситуация.

Моя активность привязана к службе, которая выполняет тяжелую передачу данных из Интернета через AsyncTask.

Поскольку обслуживание тяжелое, мне нужно сделать, чтобы он был остановлен, когда пользователь переместился на активность, поэтому я обязательно остановлю службу в 'onDestroy()'.

Когда изменения конфигурации «onDestroy()» вызывается - и поэтому «onPause()» и «onStop()» - и впоследствии служба останавливается на «onDestroy()».

Дело в том, что я не хочу, чтобы служба останавливалась при изменении конфигурации.

Пожалуйста, любое предложение очень ценится!

И спасибо за помощь!

ответ

2

Вы можете позвонить в onDestroy()isChangingConfigurations() на API Level 11. Вы можете обратиться к этому сообщению, How to distinguish if activity is changing configurations.

Возможно, вам стоит воспользоваться другим подходом. Я думаю, вы должны использовать IntentService (который работает в фоновом режиме, больше не нужно для AsyncTask), используйте эту службу для извлечения данных хранилища &, а затем сообщите Activities, что данные обновляются, возможно, с помощью Broadcast.

+0

Спасибо! Действительно, ваши предложения кажутся очень разумными! –

0

Попробуйте с этим:

<service android:name=".yourService" 
     android:configChanges="keyboardHidden|orientation"></service> 

Примените этот атрибут в файл manifest.

Краткое объяснение:

По умолчанию, когда некоторые ключевые изменения конфигурации происходят на Android (Типичным примером является изменение ориентации), Android полностью перезапускает ход деятельности/услуг, чтобы помочь ему приспособиться к таким изменениям.

Когда вы определяете android:configChanges="keyboardHidden|orientation" в своем AndroidManifest, вы сообщаете Android: «Пожалуйста, не делайте сброса по умолчанию, когда клавиатура вытащена, или телефон повернут, я хочу справиться с этим сам. что я делаю".

+0

спасибо, пожалуйста, можете ли вы рассказать мне очень коротко, что такое puropse этого параметра в манифесте? Благодаря!!! –

+1

@MaurizioPietrantuono см. Мое редактирование. Я просто добавил короткое объяснение этому. –

+0

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

0

Я могу предложить две вещи для вашей проблемы.

1) используйте тег в своей деятельности (Да, не работая в службе) в файле манифеста, что в основном предотвратит отдых активности при изменении ориентации. поэтому onDestroy не будет вызван.

android:configChanges="keyboardHidden|orientation" 

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

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
} 
+0

спасибо Ankit! Пожалуйста, исправьте меня, если я ошибаюсь: в основном я объявлю Android, что я буду управлять ориентацией устройства, а это означает, что когда экран вращается, экран вообще не изменится (и поэтому пользователь увидит потенциал роста внизу экран) –

+1

да правильный. Если вы хотите, чтобы система также меняла конфигурацию. Вы можете использовать эту логику BroadcastReceiver, чтобы сообщить Activity, когда загрузка выполнена. и может вызвать stop self (или использовать IntentService). Благодаря!! Еще одно предложение не выполняет задачу очистки объекта onDestroy, они предлагают onPause для того же самого. – AAnkit

Смежные вопросы