如何在Android活动中每分钟运行一次代码?

4
在我的 Android 项目中,我有一个需要每分钟运行一次代码的活动。我该怎么做?当活动正在运行且未暂停(即用户正在查看它而不是其他活动)时,代码需要每分钟运行一次。同时,在应用程序最小化时不应运行。当活动结束时,代码应停止运行。
有人知道如何编写这个代码吗?
谢谢。
2个回答

9
你可以在你的活动中注册 android.intent.action.TIME_TICK 广播。
private BroadcastReceiver receiver;

@Overrride
public void onCreate(Bundle savedInstanceState){


  IntentFilter filter = new IntentFilter();
  filter.addAction("android.intent.action.TIME_TICK");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      // TODO : codes runs every minutes
    }
  }
     registerReceiver(receiver, filter);
}

@Override
protected void onDestroy() {
  super.onDestroy();
  unregisterReceiver(receiver);
}

广播动作: 当前时间已更改。每分钟发送一次。您无法通过在清单中声明的组件接收此内容,只能通过使用Context.registerReceiver()显式注册来接收它。

这是一个受保护的意图,只能由系统发送。

常量值:"android.intent.action.TIME_TICK"

REFERENCE

更新
如Joakim在评论中提到的,如果您想在活动停止运行时停止代码,则可以在onResume中注册接收器,并在onPause中取消注册。

@Override
protected void onPause() {
  super.onPause();
  unregisterReceiver(receiver);
}

@Overrride
public void onResume(){
  super.onResume();
  registerReceiver(receiver, filter);
}

"TIME_TICK" 是指每一分钟吗? - omega
是的,TIME_TICK 广播事件在时间更改时触发(每分钟一次),我会编辑答案并添加参考。 - Farnabaz
2
代码将会在应用最小化的情况下运行。您可以在onResume中注册接收器,在onPause中注销它,以获得帖子中所述的效果。 - Joakim Palmkvist
@JoakimPalmkvist 是的,你说得对,我错过了这个,我会更新答案,谢谢。 - Farnabaz

1
在onResume中,您可以启动一个线程来执行您的代码。 然后休眠一分钟。 在onPause中,您可以停止此线程(将run设置为false)。

类似于这样:

private class myThread extends Thread{
    private boolean run = true;

    public void run(){
        while(run){
            do code
            Thread.sleep(1000l * 60) // one minute
        }
     }
}

l 将类型转换为 long。在这种情况下,这并不是真正的问题,但如果您想将时间设置为类似于 1000 * 60 * 60 *24 *40 *60 的值,则会创建为 int,因此它将不是正确的数量。该值将是 MAX_INTEGER 而不是正确的 long 值。 - Joakim Palmkvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接