Android таймер обратного отсчета в фоновом режиме - PullRequest
4 голосов
/ 14 ноября 2011

У меня есть приложение для Android с управлением обратным отсчетом (класс CountDownTimer), которое отображается на экране приложения, чтобы показать, сколько времени осталось до 00:00.Кнопка «Домой» или при запуске другого приложения приложение / таймер не работает в фоновом режиме.Так что я подозреваю, что должен сделать услугу, но как?Коллеги сказали мне, что я должен сделать что-то особенное, когда устройство заблокировано, чтобы таймер продолжал работать.Я хочу проснуться, когда приехал в 0.

Каков наилучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Вы должны создать свой класс CountDownTimer и расширить его из класса Service.Таким образом, ваша деятельность становится службой, и она работает в фоновом режиме, даже если вы закрываете приложение или экран, это не имеет значения, оно просто выполняет задачу, назначенную вам в фоновом режиме.

0 голосов
/ 23 ноября 2016

Самый простой способ - использовать сервис с таймером асинхронности.Вы можете скачать исходный код здесь ( Таймер обратного отсчета Android в фоновом режиме )

Класс обслуживания:

package com.countdowntimerservice;


import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
 import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class Timer_Service extends Service {

public static String str_receiver = "com.countdowntimerservice.receiver";

private Handler mHandler = new Handler();
Calendar calendar;
SimpleDateFormat simpleDateFormat;
String strDate;
Date date_current, date_diff;
SharedPreferences mpref;
SharedPreferences.Editor mEditor;

private Timer mTimer = null;
public static final long NOTIFY_INTERVAL = 1000;
Intent intent;

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

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

    mpref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    mEditor = mpref.edit();
    calendar = Calendar.getInstance();
    simpleDateFormat = new SimpleDateFormat("HH:mm:ss");

    mTimer = new Timer();
    mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL);
    intent = new Intent(str_receiver);
}


class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        mHandler.post(new Runnable() {

            @Override
            public void run() {

                calendar = Calendar.getInstance();
                simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
                strDate = simpleDateFormat.format(calendar.getTime());
                Log.e("strDate", strDate);
                twoDatesBetweenTime();

            }

        });
    }

}

public String twoDatesBetweenTime() {


    try {
        date_current = simpleDateFormat.parse(strDate);
    } catch (Exception e) {

    }

    try {
        date_diff = simpleDateFormat.parse(mpref.getString("data", ""));
    } catch (Exception e) {

    }

    try {


        long diff = date_current.getTime() - date_diff.getTime();
        int int_hours = Integer.valueOf(mpref.getString("hours", ""));

        long int_timer = TimeUnit.HOURS.toMillis(int_hours);
        long long_hours = int_timer - diff;
        long diffSeconds2 = long_hours / 1000 % 60;
        long diffMinutes2 = long_hours / (60 * 1000) % 60;
        long diffHours2 = long_hours / (60 * 60 * 1000) % 24;


        if (long_hours > 0) {
            String str_testing = diffHours2 + ":" + diffMinutes2 + ":" + diffSeconds2;

            Log.e("TIME", str_testing);

            fn_update(str_testing);
        } else {
            mEditor.putBoolean("finish", true).commit();
            mTimer.cancel();
        }
    }catch (Exception e){
        mTimer.cancel();
        mTimer.purge();


    }

    return "";

}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e("Service finish","Finish");
}

private void fn_update(String str_time){

    intent.putExtra("time",str_time);
    sendBroadcast(intent);
}
}
0 голосов
/ 14 ноября 2011

Прежде всего, вам нужно использовать Handler для управления таймером, но посмотрите этот великий пост, чтобы увидеть, поможет ли он:

Как установить таймер в Android

Ресурсы Android для разработчиков также затрагивают эту тему:

http://developer.android.com/resources/articles/timed-ui-updates.html

...