2016-02-16 2 views
0

У меня есть фоновое обслуживание с CountdownTimer. Когда CountdownTimer подсчитывает, я отправляю широковещательную передачу в Activity. Когда CountdownTimer подсчитал, активность активируется, и я могу остановить службу и отменить регистрацию получателя.Отправить трансляцию в действие, которое не находится на переднем плане

Я переместил обычный метод отмены регистрации на onStop и onPause в свой собственный метод, который я вызываю, как только передача принимается с помощью «timer_finished». Это значит, что я могу отойти от Activity без регистрации.

Все работает нормально, если пользователь просматривает активность. Если пользователь удаляется от Activity, CoundownTimer все еще работает, но Activity не получает широковещательные передачи.

Как это сделать, чтобы активность получила окончательную трансляцию «timer_finished»?

public class CountDownBroadcastService extends Service { 

    private static final String TAG = CountDownBroadcastService.class.getSimpleName(); 

    public static final String COUNTDOWN_BR = "com.carefreegroup.rr3.countdown_br"; 
    Intent bi = new Intent(COUNTDOWN_BR); 

    CountDownTimer cdt = null; 
    Context mContext; 

    @Override 
     public void onCreate() {  
      super.onCreate(); 

      mContext = this; 

      Log.i(TAG, "Starting timer..."); 


      cdt = new CountDownTimer(10000, 1000) { 
       @Override 
       public void onTick(long millisUntilFinished) { 

        Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished/1000); 
        bi.putExtra("countdown", millisUntilFinished); 
        bi.putExtra("timer_status", "timer_not_finished"); 
        sendBroadcast(bi); 
       } 

       @Override 
       public void onFinish() { 
        Log.i(TAG, "Timer finished"); 

        bi.putExtra("timer_status", "timer_finished"); 


        sendBroadcast(bi); 

       } 
      }; 

      cdt.start(); 
     } 

     @Override 
     public void onDestroy() { 

      cdt.cancel(); 
      Log.i(TAG, "Timer cancelled"); 
      super.onDestroy(); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) {  
      return super.onStartCommand(intent, flags, startId); 
     } 

     @Override 
     public IBinder onBind(Intent arg0) {  
      return null; 
     } 
} 

.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(TAG, "start of oncreate"); 

     setContentView(R.layout.loneworker); 

     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setIcon(R.drawable.ic_launcher); 
     setTitle("Lone Worker"); 
     nfcscannerapplication = (NfcScannerApplication) getApplication(); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

     tvCountDown = (TextView)findViewById(R.id.tvloneworkercountdown); 
     callFinished = (Button)findViewById(R.id.buttonlwcallfinished); 


     callFinished.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.e(TAG, "inside callFinished"); 
       //maybe alert carer is safe*************************************** 

       setCountDownFinished(); 

      } 
     }); 




     startService(new Intent(this, CountDownBroadcastService.class)); 
     Log.i(TAG, "Started service"); 






    }//end of onCreate 



    private BroadcastReceiver br = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) {    
      updateGUI(intent); // or whatever method used to update your GUI fields 
     } 
    }; 


    public void onResume() { 
     super.onResume();   
     registerReceiver(br, new IntentFilter(CountDownBroadcastService.COUNTDOWN_BR)); 
     Log.i(TAG, "Registered broacast receiver"); 
     } 



    private void updateGUI(Intent intent) { 
     if (intent.getExtras() != null) { 
      long millisUntilFinished = intent.getLongExtra("countdown", 0); 
      //Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished/1000);  

      String status = intent.getStringExtra("timer_status"); 

      if(status.equalsIgnoreCase("timer_not_finished")){ 

        tvCountDown.setText("Countdown seconds remaining: " + millisUntilFinished/1000); 

      }else if(status.equalsIgnoreCase("timer_finished")){ 

       setCountDownFinished(); 
      } 
     } 
    }//end of updateGUI 


    public void setCountDownFinished(){ 

     tvCountDown.setText("0"); 
     unregisterReceiver(br); 
     Log.i(TAG, "Unregistered broacast receiver"); 

     stopService(new Intent(this, CountDownBroadcastService.class)); 
     Log.e(TAG, "Stopped CountDownBroadcastService"); 

    }// end of setCountDownFinished() 




} 
+0

Пожалуйста, помогите мне понять, ваша деятельность находится в состоянии паузы или уничтожены при попытке транслировать –

+0

@AttiqurRehman Он отлично работает, когда активность находится на переднем плане. Он не работает, когда я нажимаю кнопку «Назад» и говорю «перейти к другому действию». я не переопределяю ни один из методов жизненного цикла Activity, поэтому я предположил, что Activity все равно будет находиться в стеке и, возможно, в состоянии паузы. – turtleboy

+0

не могли бы вы рассказать нам, почему транслятор должен жить в Управлении вместо того, чтобы иметь автономный вещательный приемник, который выполняет «остановку службы и отмену регистрации получателя». Если активность не видна, то ее gui не обновляется – k3b

ответ

1
When you register a broadcast receiver programmatically in an activity, it will not get broadcasts when the activity is paused. The BroadcastReceiver docs are not as clear as they could be on this point. They recommend unregistering on onPause solely to reduce system overhead. 

If you want to receive events even when your activity is not in the foreground, register the receiver in your manifest using the receiver element. 
+0

Если я зарегистрирую приемник с использованием элемента-получателя в манифесте, как я могу обновить интерфейс, если действие находится на переднем плане и как я отправляю строку «timer_finished» в Activity, если Activity не находится на переднем плане? – turtleboy

+1

Вы можете обрабатывать эту вещь через Сервис, потому что просто хотите закрыть счетчик, чтобы не показывать активность ... Если вы действительно хотите показать свою активность, то вы начнете свою деятельность - я предлагаю вам начать работу с launchMode = "SingleInstance" –

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