3

可能重复:
Android 常规任务(相当于 cronjob)

我目前正在尝试使用以下代码每天执行一项任务

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 类可能有问题。我该如何解决我的问题??

4

2 回答 2

3

Milos 提出了一些很好的观点,但请不要将您的服务设为前台服务。相反,请使用 AlarmManager。您可以查看几个相关问题:

Android AlarmManager - 安排一个重复的 Intent 每天触发两次

警报管理器不工作

ETC...

于 2013-01-22T12:35:35.457 回答
1

实际上,在 Android 中没有可以 100% 保证执行的“无法杀死的任务”。如果你看一下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

于 2013-01-22T12:02:26.263 回答