这是东西。我在服务上运行了CountdownTimer。另一方面,我(在UI线程上)有一个处理意图的BroadcastReceiver(其中包含与时间有关的数据)。
如果我不最小化工作正常。如果我最小化但我不锁定屏幕,则效果很好。
现在,当我锁定屏幕时,该服务将继续提供服务(现在,它会以更大的间隔运行,例如3秒,我猜该线程不再具有相同的优先级了),并且接收器正在接收。但是,当倒计时即将结束时,它不会。在某些情况下,如果剩余1秒,服务就会停止提供。
还有另外一种情况(我已经测试了几个1min和2min计时器),当它起作用时,是一种偶然的事情。
我进行的最后一次测试是7分钟计时器(420秒),服务发送的最后信息是419“ tick”。
我如何强制服务至少在完成时调用onFinish?尽管它没有提供每个“滴答声”。
提前感谢!
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
}
}