Получать данные от сервиса к активности после закрытия приложения - PullRequest
0 голосов
/ 11 декабря 2018

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

это мой код активности:

private long verifyTime;
long DEFAULT_VERIFY_TIME = 50000;
private final int CODE_LENGTH = 5;
private ProgressDialog progressDialog;
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        verifyTime = intent.getLongExtra(Global.TIMER , verifyTime);
        setTxtTimer();
    }
};

@Override
protected void onResume() {
    registerReceiver(receiver, new IntentFilter(Global.TIMER_KEY));
    sendBroadCast();
    super.onResume();
}
@Override
protected void onStop() {
    Intent intent = new Intent(CodeReceiverActivity.this,CodeReceiverService.class);
    intent.putExtra(Global.TIMER , verifyTime);
    startService(intent);
    unregisterReceiver(receiver);
    super.onStop();
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_code_reicever);

 }
private void sendBroadCast(){
    if(isMyServiceRunning(CodeReceiverService.class)){
        CodeReceiverService service = new CodeReceiverService(getApplicationContext());
        service.sendBroadCast();
    }else {
        verifyTime = DEFAULT_VERIFY_TIME;
        setTxtTimer();
    }
}

private void setTxtTimer(){
    new CountDownTimer(verifyTime, 1000) {
        public void onTick(long millisUntilFinished) {
            millisUntilFinished = millisUntilFinished - 1000;
            String time = String.format(Locale.ENGLISH, "%02d:%02d",
                    (TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)) % 60,
                    (TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)) % 60);
            txtTimer.setText(time);
        }

        @Override
        public void onFinish() {
            cancel();
            btnResend.setEnabled(true);
            btnResend.setAlpha(1f);
        }
    }.start();
}

этот сервисный код:

public class CodeReceiverService extends Service {
long timer;
long returnTime;
Context context;
public CodeReceiverService() {
}

public CodeReceiverService(Context context) {
    this.context = context;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    timer = intent.getLongExtra(Global.TIMER , 0);
    setTimer();

    return START_REDELIVER_INTENT;
}
@Override

public IBinder onBind(Intent intent) {

    return null;
}
private void setTimer(){
    new CountDownTimer(timer, 1000) {
        public void onTick(long millisUntilFinished) {
            millisUntilFinished = millisUntilFinished - 1000;
            returnTime = millisUntilFinished;
        }

        @Override
        public void onFinish() {
            stopSelf();
        }
    }.start();
}
public void sendBroadCast(){
    Intent intent = new Intent(Global.TIMER_KEY);
    Bundle bundle = new Bundle();
    bundle.putLong(Global.TIMER , returnTime);
    intent.putExtras(bundle);
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
  }

}

и манифест андроида:

    <service android:name=".utils.CodeReceiverService" />

1 Ответ

0 голосов
/ 11 декабря 2018

Лучше сохранить данные в SharePrefs.Вы не можете отправить данные в действие, если оно закрыто. Сохраните в SharePref и в onResume () действия, получить его из SharePrefs намного лучше

...