Захват таймера обратного отсчета в различных действиях - PullRequest
3 голосов
/ 28 февраля 2012

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

Код ниже, метод sendnotification - это метод, который выдает предупреждение, когда время заканчивается, и sendnotificationTiempo для отправки уведомления на вкладку каждую секунду, чтобы показать вверху.

public static final int NOTIFICATION_ID = 33;
public static final int NOTIFICATION_ID_Tiempo = 34;
private int minCrono;
TextView text;
MyCounter timer;

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


    StartCrono = (Button) findViewById(R.id.butt_start);
    CancelCrono = (Button) findViewById(R.id.butt_cancel);
    text=(TextView)findViewById(R.id.text_countTime1);

    CancelCrono.setEnabled(false);


    minCrono = mins.getCurrentItem();

    StartCrono.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            minCrono=(60000*minCrono);      
            timer = new MyCounter(minCrono,1000);
            timer.start();
        }
    });

    CancelCrono.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            timer.cancel();     
            text.setText("El tiempo se ha cancelado");
            minutosCrono =  mins.getCurrentItem();

            if (mNotificationManager != null)
                mNotificationManager.cancel(NOTIFICATION_ID_Tiempo);

        }           
    });
}

Класс обратного отсчета:

public class MyCounter extends CountDownTimer{          
    public MyCounter(long millisInFuture, long countDownInterval) {     
        super(millisInFuture, countDownInterval);           
    }
     @Override
    public void onFinish() {

        StartCrono.setEnabled(true);
        CancelCrono.setEnabled(false);
        mins.setEnabled(true);
        minCrono = mins.getCurrentItem(); 
        // 

        text.setText("Time Complete!"); 

        sendnotification("Guau", "Time finished.");

    }
    @Override
     public void onTick(long millisUntilFinished) {
        long segRestantesTotal=(millisUntilFinished/1000);
        long minRestantes= (segRestantesTotal/60);
        long segRestantes= (segRestantesTotal%60);


        if(segRestantes>=10){
            text.setText(minRestantes+":"+segRestantes);
            sendnotificationTiempo("Guau", minRestantes+":"+segRestantes);
        }
        else{
            text.setText(minRestantes+":0"+segRestantes);
            sendnotificationTiempo("Guau", minRestantes+":0"+segRestantes);
        }
    }   
}   

}

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

Или, может быть, я смогу получить идеальное время, которое отсчитывается от вкладки уведомлений. Спасибо!

1 Ответ

0 голосов
/ 28 февраля 2012

Переместите свой экземпляр MyCounter из Activity.Когда действие перезапускается, экземпляр воссоздается, поэтому старый исчезает.Есть несколько способов сделать это, но вам нужно, чтобы ваш экземпляр MyCounter находился где-то, чтобы Activity мог получить к нему доступ, но не отвечал за его жизненный цикл.Я использую элементарную реализацию ServiceLocator, которую я написал, но вы можете легко создать собственный класс Application и сохранить там таймер (или класс контроллера, который создает и контролирует таймер).

...