CountdownTimer在使用中

问题描述 投票:0回答:1

这是东西。我在服务上运行了CountdownTimer。另一方面,我(在UI线程上)有一个处理意图的BroadcastReceiver(其中包含与时间有关的数据)。

如果我不最小化工作正常。如果我最小化但我不锁定屏幕,则效果很好。

现在,当我锁定屏幕时,该服务将继续提供服务(现在,它会以更大的间隔运行,例如3秒,我猜该线程不再具有相同的优先级了),并且接收器正在接收。但是,当倒计时即将结束时,它不会。在某些情况下,如果剩余1秒,服务就会停止提供。

还有另外一种情况(我已经测试了几个1min和2min计时器),当它起作用时,是一种偶然的事情。

我进行的最后一次测试是7分钟计时器(420秒),服务发送的最后信息是419“ tick”。

我如何强制服务至少在完成时调用onFinish?尽管它没有提供每个“滴答声”。

提前感谢!

android multithreading service timer countdown
1个回答
0
投票
public class TimerService extends Service {

public static final String COUNTDOWN_BR = "your_package_name.countdown_br";
private final static String TAG = "BroadcastService";
public static boolean isServiceRunnin = false;
Intent bi = new Intent(COUNTDOWN_BR);
CountDownTimer cdt = null;

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "Starting timer...");
    isServiceRunnin = true;
    cdt = new CountDownTimer(60000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            int seconds = (int) (millisUntilFinished / 1000) % 60;
            int minutes = (int) ((millisUntilFinished / (1000 * 60)) % 60);
            if (seconds == 1 && minutes == 0) {
                bi.putExtra("expire", true);
                isServiceRunnin = false;
             } else {
                bi.putExtra("expire", false);
                isServiceRunnin = true;
            }
            //bi.putExtra("countdown", minutes + ":" + seconds + " Min");
            bi.putExtra("countdown", minutes + ":" + seconds);
            System.out.println("countdown---" + minutes + "/" + seconds);
            sendBroadcast(bi);
        }

        @Override
        public void onFinish() {
            Log.i(TAG, "Timer finished");
             isServiceRunnin = false;
        }
    };
    cdt.start();
}


@Override
public void onDestroy() {
    if (cdt != null) {
        cdt.cancel();
    }
    try {
        bi.putExtra("expire", true);
         sendBroadcast(bi);
    } catch (Exception ignored) {
    }
    Log.i(TAG, "Timer cancelled");
    isServiceRunnin = false;
    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;
}

和您的活动使接收者像这样

private BroadcastReceiver br = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent != null) {
            String text = "";
            if (intent.hasExtra("expire")) {
                if (intent.getBooleanExtra("expire", false)) {
                    if (isAdded() && isVisible()) {
                       //make yor conditon session expired
                    }
                }  
                    text = intent.getStringExtra("countdown");


            }
        }
    }
};

在接收中,您可以获取// //intent.getStringExtra("countdown“)intent.hasExtra(” expire“)如果(intent.getBooleanExtra(“ expire”,false)){做你的条件}

并做了更多的事情来像这样启动您的倒计时服务

   Intent msgIntent = new Intent(getActivity(), TimerService.class);
    getActivity().startService(msgIntent);
    try {
        getActivity().registerReceiver(br, new IntentFilter(TimerService.COUNTDOWN_BR));
    } catch (Exception ignored) {
    }

在您的暂停方法中使一个布尔值

  @Override
public void onPause() {
    super.onPause();
    isActivityPaused = true;
}

基于您可以处理时间的isActivityPaused布尔值是否到期

onResume方法这样写

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

        if (isActivityPaused && !TimerService.isServiceRunnin) {
            isActivityPaused = false;
             //your condition
         }

}
© www.soinside.com 2019 - 2024. All rights reserved.