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 - 定期的なインテントを 1 日 2 回起動するようにスケジュールする

AlarmManager が機能しない

等...

于 2013-01-22T12:35:35.457 に答える
1

実際、Android には 100% 確実に実行できる「殺せないタスク」はありません。Android ライフサイクル管理を見ると、デバイスにリソースが必要な場合、システムは実行中の未使用または古いタスクを強制終了します。

これは Android サービスでも同じです。サービスは単純なタスクとしてより大きな特権を持っていますが、サービスはシステムによって強制終了される可能性があります。

あなたの場合の問題は、おそらくタイマーを 5 分に設定しているときに、サービスが正しく実行されていることです。時間を大幅に増やすと問題が発生します。次に、サービスが停止される可能性がはるかに高くなります: http://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/を参照してください。

したがって、目標を達成するには別のアプローチを検討する必要があります。解決策の 1 つですが、まだ 100% の保証はありませんが、フォアグラウンド サービスを使用することです: http://developer.android.com/guide/components/services.html#Foreground

于 2013-01-22T12:02:26.263 に答える