定时器任务在android中无限期后停止运行

时间:2012-10-31 12:39:37

标签: android service timer timertask background-service

我是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);

};

3 个答案:

答案 0 :(得分:4)

在我看来,你应该使用带有IntentService的AlarmManager来安排重复后台任务而不是Timer任务。 Timer不可靠,并且在Android Framework中并不总能正常工作。此外,如果手机处于睡眠状态,计时器将不会执行。您可以通过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

答案 1 :(得分:1)

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

以下是一个示例,如何使用AlarmManager

答案 2 :(得分:0)

我猜你可以更好地完成这项任务,如果你使用CountDown Timer,它有一个内置的方法,在你指定的时间后调用

实施例

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毫秒调用一次

详细了解here