4

我是android的新手。我正在开发一个应用程序,其中每 5 秒在后台执行一段特定的代码。为了实现这一点,我正在使用一个带有计时器的服务,其中包含一个计时器任务。有时它工作正常,但经过一些不确定的服务正在运行,但计时器任务在 android 中自动停止。这是我的代码,请帮忙。提前致谢。

    public void onStart(Intent intent, int startid) {
    //this is the code for my onStart in service class
    int delay = 1000; // delay for 1 sec.

    final int period = 5000; // repeat 5 sec.

    timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
                        executeCode();
    }, delay, period);

};
4

3 回答 3

4

在我看来,您应该使用带有 IntentService 的 AlarmManager 来安排重复的后台任务而不是 Timer 任务。Timer 是不可靠的,并且在 Android 框架中并不总是能正常工作。此外,如果手机处于睡眠状态,计时器将不会执行。您可以让闹钟唤醒手机以使用 AlarmManager 执行您的代码。

看:

https://developer.android.com/reference/android/app/AlarmManager.html

http://mobile.tutsplus.com/tutorials/android/android-fundamentals-scheduling-recurring-tasks/

http://android-er.blogspot.in/2010/10/simple-example-of-alarm-service-using.html

如果手机重启,您将需要再次触发警报管理器。有关如何执行此操作的确切说明,请参阅本教程:

http://www.androidenea.com/2009/09/starting-android-service-after-boot.html

于 2012-10-31T12:50:29.040 回答
1

通常,当设备长时间进入睡眠模式时,TimerTask 会停止。尝试使用 AlarmManager 类来满足您的要求。AlarmManager 也使用较少的电池消耗。

这是一个例子,如何使用AlarmManager

于 2012-10-31T12:50:04.433 回答
0

我想如果您使用具有内置方法的倒计时计时器,您可以更好地完成此任务,该方法在您指定的时间后调用

例子

public class CountDownTest extends Activity {
TextView tv; //textview to display the countdown
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
this.setContentView(tv);
//5000 is the starting number (in milliseconds)
//1000 is the number to count down each time (in milliseconds)
MyCount counter = new MyCount(5000,1000);
counter.start();
}
//countdowntimer is an abstract class, so extend it and fill in methods
public class MyCount extends CountDownTimer{
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
tv.setText(”done!”);
}
@Override
public void onTick(long millisUntilFinished) {
tv.setText(”Left: ” + millisUntilFinished/1000);
}
}

编辑
您可以在 OnTick 方法中执行任何功能,在上面的示例中每 1000 毫秒调用一次

在此处了解更多信息

于 2012-10-31T12:52:55.303 回答