У меня есть фоновое обслуживание с 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()
}
Пожалуйста, помогите мне понять, ваша деятельность находится в состоянии паузы или уничтожены при попытке транслировать –
@AttiqurRehman Он отлично работает, когда активность находится на переднем плане. Он не работает, когда я нажимаю кнопку «Назад» и говорю «перейти к другому действию». я не переопределяю ни один из методов жизненного цикла Activity, поэтому я предположил, что Activity все равно будет находиться в стеке и, возможно, в состоянии паузы. – turtleboy
не могли бы вы рассказать нам, почему транслятор должен жить в Управлении вместо того, чтобы иметь автономный вещательный приемник, который выполняет «остановку службы и отмену регистрации получателя». Если активность не видна, то ее gui не обновляется – k3b