android 服务计时,android - 实现倒计时工作服务

所以我有一个代码与CountDownTimer现在工作。但我需要把这个放在服务当然在后台运行。 我不知道该怎么做,我试过没有成功。android - 实现倒计时工作服务

这是我的课倒计时

public class CountDown {

//Interface a ser implementada por um listener

public interface CountDownListener {

//Chamado quando o valor de secondsLeft é alterado,

//quando for decrementado ou incrementado.

void onChange(long timeLeft);

//Chamado quando o contador chegar ao fim.

void onEnd();

}

private long fromSeconds;

private long secondsLeft;

private CountDownListener listener;

private boolean isCounting = false;

//Valor em milissegundos de um segundo.

private static final long ONE_SECOND = 1000;

private static final int MSG = 1;

//Constrói o contador com o valor inicial de segundos.

public CountDown(long fromSeconds){

this.fromSeconds = fromSeconds;

handler = new CountDownHandler(this);

}

//Inicia a contagem, a partir do valor inícial.

public synchronized void start(){

if(isCounting){

return;//ou talvez lançar uma excepção

}

isCounting = true;

secondsLeft = fromSeconds;

handler.sendMessage(handler.obtainMessage(MSG));

}

//Pára a contagem.

public synchronized void stop(){

if(!isCounting){

return;//ou talvez lançar uma excepção

}

isCounting = false;

handler.removeMessages(MSG);

}

//Retoma a contagem.

public synchronized void resume(){

if(isCounting || secondsLeft == 0){

return;//ou talvez lançar uma excepção

}

isCounting = true;

handler.sendMessageDelayed(handler.obtainMessage(MSG), ONE_SECOND);

}

//Incrementa o valor do contador.

public synchronized long increaseBy(long fromSeconds){

secondsLeft += fromSeconds;

return secondsLeft;

}

//true se o contador estiver contando.

public boolean isCounting(){

return isCounting;

}

//Guarda um listener.

public void setCountDownListener(CountDownListener listener){

this.listener = listener;

}

//Método para formatar um valor em segundos em algo tipo "mm:ss" ou "HH:mm:ss".

public static String secondsToString(long seconds, String format){

return DateFormat.format(format, seconds * ONE_SECOND).toString();

}

private final Handler handler;

//Handler para controlar o contador

private static class CountDownHandler extends Handler

{

private final WeakReference countDownWeakReference;

private CountDownHandler(CountDown countDownInstance) {

countDownWeakReference = new WeakReference<>(countDownInstance);

}

@Override

public void handleMessage(Message msg) {

CountDown countDown = countDownWeakReference.get();

if(countDown == null){

return;

}

synchronized (countDown) {

//Guarda o instante em que inicia o processamento.

long tickStart = SystemClock.elapsedRealtime();

//Se tiver sido parado sai.

if(!countDown.isCounting){

return;

}

//Notifica o listener com o segundos que faltam para terminar.

if (countDown.listener != null) {

countDown.listener.onChange(countDown.secondsLeft);

}

//O contador chegou ao fim, notifica o listener.

if (countDown.secondsLeft == 0) {

countDown.isCounting = false;

if (countDown.listener != null) {

countDown.listener.onEnd();

}

} else {

//decrementa o contador.

countDown.secondsLeft--;

//Obtém o tempo para o próximo decremento.

//Leva em conta o tempo gasto no processamento,

//principalmente o eventualmente gasto pela implementação

// do método onChange() no listener.

long delay = ONE_SECOND - (SystemClock.elapsedRealtime() - tickStart);

//Se o tempo gasto for superior a um segundo, ajusta-o para o próximo.

//Se o tempo gasto no método onChange() for próximo ou

// superior a um segundo ele só será chamado no próximo.

while(delay < 0){

countDown.secondsLeft--;

delay += ONE_SECOND;

}

//Garante o término se o tempo for excedido

if(countDown.secondsLeft < 0){

countDown.listener.onEnd();

}else {

//Agenda o próximo decremento.

sendMessageDelayed(obtainMessage(MSG), delay);

}

}

}

}

};}

随着第二类

public CountDownBehavior(long alarmTime, String displayFormat){

//Valor em segundos no qual deve ser chamado onAlarm().

this.alarmTime = alarmTime;

//Formato da string passada ao displayTimeLeft().

this.displayFormat = displayFormat;

}

@Override

public void onChange(long timeLeft) {

//Aqui é implementado o comportamento que queremos ter enquanto

//o CountDown "conta".

//Deve informar quando chegar a altura de accionar o alarma.

if(timeLeft == alarmTime)

{

onAlarm();

}

//Informa o valor actual do contador, com o formato indicado por displayFormat.

displayTimeLeft(CountDown.secondsToString(timeLeft, displayFormat));

}

//Metodos a implementar em resposta ao comportamento.

protected abstract void onAlarm();

protected abstract void displayTimeLeft(String timeLeft);}

而且从MyActivity

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView)findViewById(R.id.textView);

createNotification();

//Cria o contador com 1 minuto

countDown = new CountDown(TIME);

//Cria e atribui um CountDownBehavior ao contador

countDown.setCountDownListener(new CountDownBehavior(ALARM, "mm:ss") {

@Override

public void onEnd() {

mBuilder.mActions.clear();

mBuilder.setOngoing(false);

mBuilder.setContentText("Seu tempo acabou.");

mNotifyMgr.notify(mNotificationId, mBuilder.build());

//mNotifyMgr.cancel(mNotificationId);

}

@Override

protected void onAlarm() {

alarmMethodwithCount();

}

@Override

protected void displayTimeLeft(String timeLeft) {

mBuilder.setContentText(timeLeft + " restante");

mNotifyMgr.notify(mNotificationId, mBuilder.build());

textView.setText(timeLeft);

}

});

alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

countDown.start();

alarmMethod();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值