Почему мой 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 секунд.

Рекомендуемое или типичное использование приемника вещания заключается в

  • Начать сервис
  • Показать тост
  • Начать деятельность

В вашем случае вы должны запустить сервис с вашего широковещательного приемника и выполнить всю работу в этом сервисе.

Другие вопросы по тегам