用于重复任务的Android处理程序 - 它会重叠吗?定时器任务VS处理程序VS警报管理器

kum*_* DK 8 java android alarmmanager timertask android-handler

我正在尝试构建一个Android应用程序,它将每10分钟重复运行一些进程.我发现Handlers比定时器或安排更可靠.因此,我将Handlers使用下面给出的代码来开发我的应用程序.

我有点担心以下代码会Handlers在每次启动应用程序时创建单独的并保持并行运行,可能是因为我正在创建Handleron onCreate.

那么,一次只Handler在背景中保持一次运行的最佳方法是什么?

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler = new Handler(); // new handler
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
    setContentView(R.layout.activity_pro__sms);
} 

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        /* my set of codes for repeated work */
        foobar();
        handler.postDelayed(this, 1000*60*10); // reschedule the handler
    }
};
Run Code Online (Sandbox Code Playgroud)

Bra*_*bra 6

您可以扩展Application类并在其中完成工作.

public class App extends Application {

    private Handler handler;

    @Override
    protected void onCreate() {
        super.onCreate();
        handler = new Handler(); // new handler
        handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
        setContentView(R.layout.activity_pro__sms);
    } 

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            /* my set of codes for repeated work */
            foobar();
            handler.postDelayed(this, 1000*60*10); // reschedule the handler
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

并在清单中声明你的课程:

<application android:name=".App">
Run Code Online (Sandbox Code Playgroud)

编辑

但它只有在您的应用程序运行时才有效,否则您可以使用AlarmManager.

  • Vang给你的只会创建一个处理程序,并根据传递的时间重复该过程.注意他正在扩展Application类,它只被调用一次,也就是说,在创建应用程序时(启动应用程序时).如果完全销毁应用程序,处理程序将停止工作,否则,一次只能运行一个.如果您正在寻找一个不断运行的处理程序,请使用上面提到的AlarmManager. (2认同)

kum*_* DK 5

我决定回答我自己的问题,因为我已经找到了正确的方法。安卓方式。首先,我试图做并在问题中发布的是对我的要求的错误方法。现在我发布这个,所以其他人不会以错误的方式做,而是以下面的方式做。

Android 几乎没有计时选项。

  1. 计时器任务 -> 在应用程序处于活动状态时运行。最适合短期计时。资源使用率更高。

  2. 处理程序 -> 在应用程序处于活动状态时运行。但不适合用作调度程序。(这是我问的,这不是正确的方法)。Handlers是重复做某事直到应用程序被杀死的最佳方式。

  3. 警报管理器 -> 即使应用程序被终止,也可以安排将来发生的事情的最佳方式。(这是我应该为我的应用程序申请的内容)。

这是我想出来的。如果我错了纠正我。

  • 这是不正确的。处理程序只是在应用程序线程上调度任务。当应用程序被终止时,处理程序任务也会终止。 (4认同)
  • 不!简单地说,延迟事件永远不会发生。 (2认同)