如何在android中重复启动服务

时间:2013-01-22 11:54:05

标签: java android service

  

可能重复:
  Android regular task (cronjob equivalent)

我目前正在尝试使用代码来执行每日任务

public class BackupService extends Service {

    private Timer timer = new Timer();
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        startBackup();
        return START_STICKY;
    }

    private void startBackup() {

        Date date = new Date(time);
        System.out.println("Backup time:" +date);
        timer.scheduleAtFixedRate(new BackupTimerTask(), date,
                delayTime());
    }

    private long delayTime() {

        long delay = 86400000;
            System.out.println("delay time:" + delay);
        return delay;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (timer != null){
            timer.cancel();
            }
            Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
    }

  private class BackupTimerTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("Backup started");
            //starting backup here
        }

    }

}

我正在将此服务称为

startService(new Intent(this, BackupService.class));

如果我把短时间间隔像5分钟一样,这样可以正常工作,但是这不适用于长时间间隔。如果我去Android应用程序中运行服务,那么我可以看到我的服务处于运行状态。我认为timertask类可能有些问题。我怎么能解决我的问题?

2 个答案:

答案 0 :(得分:3)

米洛斯提出了一些好处,但请不要将您的服务作为前台服务。而是使用AlarmManager。您可以查看以下几个相关问题:

Android AlarmManager - Scheduling a recurring Intent to fire off twice a day

AlarmManager not working

等...

答案 1 :(得分:1)

实际上,在Android中没有“无法完成的任务”可以100%保证执行。 如果你看看android生命周期管理,如果设备需要资源,系统将杀死一些未使用或旧的任务。

这对Android服务来说是一样的。服务作为一项简单的任务具有更大的权限,但该服务仍然可以被系统杀死。

您的案例中的问题可能是当您将计时器设置为5分钟时,您的服务正在正常运行。当你大大增加时间时,问题就会到来。然后,服务被杀的可能性要大得多:见http://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/

所以,你必须考虑另一种方法来实现你的目标。其中一个解决方案,但仍然没有100%保证,是使用前台服务:http://developer.android.com/guide/components/services.html#Foreground