【问题标题】:How to run BroadcastReceiver after every minute?如何每分钟运行 BroadcastReceiver?
【发布时间】:2013-03-25 13:10:57
【问题描述】:

我正在开发一个应用程序来监控每分钟的网络。我为此使用了 BroadcastReceiver。

我想每分钟执行一次 BroadcastReceiver。

我该怎么做?我可以在 BroadcastReceiver 中使用 Thread.sleep() 吗?

在android中持续运行BroadcastReceiver可以吗?

【问题讨论】:

  • 如果您认为您的接收者可能会错过一些消息,请不要担心,广播接收器会接收到每条发送的消息。它本身就是一个后台服务(线程),是同一任务的一部分。

标签: android broadcastreceiver


【解决方案1】:

BroadcastReceivers 设计为仅在接收到某些广播(系统广播或用户定义的广播)时运行。如果您想每分钟运行一些代码,您可以创建一个服务并使用警报管理器将其安排为每分钟运行一次。您可以使用警报管理器从广播接收器启动服务,它将每分钟运行一次。

在广播接收器的 onRecieve() 方法中,使用类似于以下给出的代码:

PendingIntent service = null; 
Intent intentForService = new Intent(context.getApplicationContext(), YourService.class);
final AlarmManager alarmManager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
final Calendar time = Calendar.getInstance();
time.set(Calendar.MINUTE, 0);
time.set(Calendar.SECOND, 0);
time.set(Calendar.MILLISECOND, 0);
if (service == null) {
 service = PendingIntent.getService(context, 0,
                    intentForService,    PendingIntent.FLAG_CANCEL_CURRENT);
        }

        alarmManager.setRepeating(AlarmManager.RTC, time.getTime()
                .getTime(), 60000, service);

【讨论】:

    【解决方案2】:

    即使没有 AlarmManager 也能做到

        private void ping() {
        try {
            //Your code here
    
        } catch (Exception e) {
            e.printStackTrace();
        }
          scheduleNext();
        }
    
        private void scheduleNext() {
          mHandler.postDelayed(new Runnable() {
            public void run() { ping(); }
          }, 60000);
        }
    
        public int onStartCommand(Intent intent, int x, int y) {
          mHandler = new android.os.Handler();
          ping();
          return START_STICKY;
        }
    

    【讨论】:

      【解决方案3】:

      您是否有特别需要 BroadcastReceiver 的理由?如果是这样,答案很简单,就是让某个组件每分钟广播它收到的 Intent。

      我认为您应该看看警报管理器。您可以对其进行编程以定期在您的应用程序中触发 PendingIntent。我敢打赌这就是你想要的。

      【讨论】:

        【解决方案4】:

        没有。如果您能提供帮助,在 Android 或任何其他移动操作系统中连续运行任何会耗尽电池电量的东西绝对是不可接受的。

        您应该做的是使用 AlarmManager 类并每隔一分钟左右触发一个 Intent,这反过来将激活一个 Service,您可以在其中运行您想要的任何代码。

        有关示例,请参阅 this answer

        请参阅此主题以获取更多信息: Android: How to use AlarmManager

        【讨论】:

          【解决方案5】:

          我建议您使用 Service 组件,而不是使用 BroadcastReceiver。您的代码可能需要超过 10 秒才能执行,但是对于 BroadcastReceiver,您有 10 秒的限制来执行代码。

          此外,服务最适合下载、上传或播放音乐等后台进程。

          所以我建议你使用执行服务而不是 BroadcastReceiver。

          【讨论】:

            【解决方案6】:

            而不是广播接收器。您应该使用 AlarmManager 以在特定时间间隔开始 Service

            您可以从here获取示例源代码

            希望它会有所帮助。

            【讨论】:

              猜你喜欢
              • 2023-03-16
              • 2014-11-02
              • 2022-11-02
              • 2011-06-08
              • 2022-12-18
              • 2012-08-26
              • 2011-06-20
              • 1970-01-01
              相关资源
              最近更新 更多