Android定期运行方法的最佳方式

时间:2014-01-21 14:13:42

标签: android service alarmmanager

目前我有一个扩展服务的单例类:

public class ServiceSingleton extends Service {

    private static ServiceSingleton instance;
    private static boolean serviceSt;
    private static PrefValues preferences;
    private static Context context;

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public static ServiceSingleton getInstance(Context cont) {
        if (instance == null) {
            context = cont;
            // Some code

        }
        return instance;
    }

所以基本上我通过使用类似的东西每30分钟在这个类中运行一些方法:

private static void oneTasks() {
    //task itself
}

private static void oneService() {
    if (!serviceSt) {
        serviceRunning = false;
        return;
    }
    serviceRunning = true;
    oneTasks();
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            oneService();
        }
    }, (INTERVAL));
}

我也听说AlarmManager可以做同样的事情。 无论如何,我的问题是,如果我正在运行定期方法,哪种方式调用方法是最好的方法(特别是考虑到电池使用情况)?

4 个答案:

答案 0 :(得分:2)

  

目前我有一个像这样扩展服务的单例类

呸。不要将服务无限期地保存在静态数据成员中。

  

所以基本上我每隔30分钟在这个课上运行一些方法

你还没有说明你是怎么做到的。

  

无论如何,我的问题是,如果我正在运行定期方法,哪种方式调用方法是最好的方法(特别是考虑到电池使用情况)?

如果您的目标是仅在您的流程因其他原因而运行时才开展此项工作,欢迎您使用您想要的任何内容。我会使用ScheduledExecutorService

如果您的目标是执行此项工作,即使您的应用未运行,AlarmManager也会涵盖该方案。使用IntentService对其进行组合,以便您的进程在实际工作时只需要在系统RAM中。

如果你的目标是做这项工作,即使你的应用没有运行,即使设备处于睡眠状态,你也需要AlarmManager使用_WAKEUP警报,再加上WakefulBroadcastReceiver,我的WakefulIntentService或等效内容。

答案 1 :(得分:1)

通过使用警报管理器,您可以注册一个重复警报,该警报将在每个特定时间自动触发,即使您的应用程序已关闭。所以它在电池使用方面非常有效。

然后在闹钟的广播接收器内你必须实现你需要的东西。如果你的方法花费的时间超过几秒钟,你应该考虑创建一个新线程或使用IntentService类。

答案 2 :(得分:0)

我知道这肯定不是最优雅和最好的解决方案,但你可以简单地让Thread有一个无限循环,最后有SystemClock.sleep(1800000),所以基本上是这样的:

final Thread buf_liberator = new Thread(
  new Runnable() {
    public void run() {
      while (true) {
        /* Your stuff */
        SystemClock.sleep(1800000);
      }
    }
  } 
);
buf_liberator.setPriority(7);
buf_liberator.start();

此外,您需要在Thread内设置停止条件,因为您无法再使用stop()方法停止此操作。

答案 3 :(得分:0)

您也可以通过CountDownTimer

来完成
CountDownTimer countDownTimer;

 public void usingCountDownTimer() {
        countDownTimer = new CountDownTimer(Long.MAX_VALUE, 10000) {

            // This is called after every 10 sec interval. 
            public void onTick(long millisUntilFinished) {              
                setUi("Using count down timer");
            }

            public void onFinish() {              
                start();
            }
        }.start();
    }

和onPause()方法添加

@Override
    protected void onPause() {
        super.onPause();
        try {
            countDownTimer.cancel();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }