1

У меня есть IntentService, который делает долгую работу, это занимает около 15 минут. Это процесс синхронизации для получения новых данных с моего сервера.Почему мой BroadcastReceiver перестает получать через некоторое время

Когда начинается эта услуга, я также запускаю операцию, чтобы отобразить прогессию.

Это действие создает BroadcastReceiver, который перехватывает сообщения, отправленные из службы о ходе процесса.

Если я оставляю приложение, выполняющее это задание, через некоторое время SO выключает экран.

Когда я снова включаю экран, примерно через 15 минут сервис уже выполнен, но прогресс, похоже, устарел. BroadcastReceiver прекратил работать, и мое сообщение END OF SYNCHRONIZATION не было получено этой активностью.

Проблема заключается в том, что в этом сообщении я снова запускаю основное действие, чтобы пользователь снова использовал приложение.

Как я могу это решить?

+1

сообщение какой-то код ... Я предполагаю, что ваша деятельность не получает сообщения, потому что ваши приемники незарегистрированный OnPause или OnDestroy, но это трудно сказать, так как нет кода. Я бы предложил использовать serviceBinding и Messengers вместо прослушивания широковещательных приемников и отправить сообщение о старте, когда ваша активность связывается, чтобы получить самый последний статус ... но опять-таки код поможет. –

+0

@AdamW трансляция зарегистрирована и незарегистрирована в методах onStart и onStop. –

ответ

0

Я решил с этим http://developer.android.com/intl/pt-br/guide/components/services.html#Foreground.

Моя служба

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); 
      } 
     }); 
    } 

} 
0

Трансляционные приемники не предназначены для длительной работы.

Срок службы широковещательного приемника длится около 10-15 секунд.

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

  • запустить сервис
  • показать тост
  • начать активность

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