Android - 服务:只重复一次

时间:2014-05-22 19:35:04

标签: android loops service timer repeat

我有scheduleAtFixedRate的问题。 它只会调用一次而不会重复。怎么了?

public class TimerService extends Service {
static final int UPDATE_INTERVAL=3000;
private Timer timer = new Timer();
private Date date;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    repeatJob();
    //Here we want this service to continue running until it is explicitly stopped, so return sticky
    return START_STICKY;
}

private void repeatJob() {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Looper.prepare();

            date = new Date();
            displayToast(date.toString());
            Log.d("repeat", new Date().toString());

            Looper.loop();
        }
    }, 0, UPDATE_INTERVAL);
}

private void displayToast(String text) {
    Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}

}

我在片段活动中调用服务:

getActivity().startService(new Intent(getActivity().getApplicationContext(), TimerService.class));

如何从服务到片段活动获取日期的当前值(以及将来可能更多的值)?

谢谢!

2 个答案:

答案 0 :(得分:1)

你在这里做了很多奇怪的事情,我不确定究竟是什么导致了这个问题,但我会告诉你这是怎么做到的:

您应该使用AlarmManager来安排服务重复执行,并摆脱Timer。 Timer仅在您的进程处于活动状态时才有效,而AlarmManager将记住待处理的意图,即使您的应用程序的进程未运行(在这种情况下它将启动它)。它还具有更高的内存和电池效率,因为它是一个集中式系统,可以管理所有应用程序的编程任务,而不仅仅是您自己的应用程序。

服务不应该重新安排自己,只需完成它需要做的任务。请注意它们在主线程中运行,因此您需要创建一个工作线程。考虑使用IntentService因为它已经完成了这一点。要将结果传回活动,您的服务可以向包含附加内容中的数据的活动发送意图。您还可以广播结果并在活动中的广播接收器中处理它,或者您也可以绑定到服务并注册回调。

删除Looper行,删除计时器后不需要此行。

最后,您似乎对START_STICKY标志的作用感到有些困惑。它不会使服务“在显式停止之前继续运行”。无法保证服务在Android中无限期运行。这个标志的作用是告诉系统,如果它缺少内存并且它杀死了服务,一旦它恢复它应该尝试重新创建服务,但是没有重新发布待处理的意图。更多信息here

答案 1 :(得分:0)

确定。我刚刚面临同样的问题而且奇怪的是当我删除Looper.prepare& Looper.loop,它实际上以给定的间隔时间执行但是执行不成功bcoz它说它需要Looper.loop 到目前为止,我不能删除它,因为它需要,但当它在那里它使任务执行一次..加上我没有Android专家。 如果你对此有任何更新,请告诉我。