Почему мой BroadcastReceiver перестает получать через некоторое время
У меня есть IntentService
это делает долгую работу, это займет около 15 минут. Это процесс синхронизации для получения новых данных с моего сервера.
Когда запускается этот сервис, я тоже запускаю действие, чтобы отобразить прогы.
Эта деятельность создает BroadcastReceiver
, перехватывает отправленные службой сообщения о ходе процесса.
Если я оставляю приложение выполняющим свою работу, через некоторое время SO выключает экран.
Когда я снова включаю экран, примерно через 15 минут сервис уже завершен, но процесс, похоже, устарел. BroadcastReceiver
перестал работать, а мой END OF SYNCHRONIZATION
сообщение не было получено действием.
Проблема заключается в том, что в этом сообщении я снова запускаю основное действие, чтобы позволить пользователю снова использовать приложение.
Как я могу решить это?
2 ответа
Я решил с этим http://developer.android.com/intl/pt-br/guide/components/services.html.
Мой сервис
public class MyService extends Service {
public interface MyCallback {
void onProgress(int progress);
}
public class MyBinder {
public MyService getService() {
return MyService.this;
}
}
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void make(MyCallback callback) {
Notification n = new Notification.Builder(this)
.setContentTitle("Processing")
.getNotification();
startForeground(666 /*some ID*/, n);
try {
callback.onProgress(0);
// do the hard sutff and report progress
callback.onProgress(100); // report 100%
} finally {
stopForeground(true);
}
}
}
Моя деятельность
public MyActivity extends Activity implements ServiceConnection, MyService.MyCallback {
@Override
protected onStart() {
super.onStart();
// 1 - bind service to this activity
Intent i = new Intent(this, MyService.class);
this.bindService(i, this, BIND_AUTO_CREATE);
}
@Override
public void onServiceConnected(ComponentName componentName, final IBinder iBinder) {
// 2 - when the service was binded, starts the process asynchronous
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
((MyService.MyBinder) iBinder).getService().make(MyActivity.this);
return null;
}
}.execute();
}
@Override
public void onProgress(int progress) {
// 3 - when to callback is fired, update the UI progress bar
runOnUiThread(new Runnable() {
@Override
public void run() {
// call ProgressBar.setProgress(progress);
}
});
}
}
Вещательные приемники не предназначены для длительной работы.
Время жизни приемника вещания длится около 10-15 секунд.
Рекомендуемое или типичное использование приемника вещания заключается в
- Начать сервис
- Показать тост
- Начать деятельность
В вашем случае вы должны запустить сервис с вашего широковещательного приемника и выполнить всю работу в этом сервисе.