【问题标题】:Android BroadcaseReceiver performance (too slow & not accurate)Android BroadcaseReceiver 性能(太慢且不准确)
【发布时间】:2016-10-20 11:11:56
【问题描述】:

我用4个意图过滤器制作了broadcasereceiver

  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_USER_PRESENT
  • Intent.ACTION_BOOT_COMPLETED

有效!!! 每次收到带有4条语句的广播消息, 我可以找到有效的日志消息!!!

        @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        switch (intent.getAction()) {
            case Intent.ACTION_SCREEN_ON:
                Log.d("mypackage", "ACTION_SCREEN_ON");
                break;
            case Intent.ACTION_SCREEN_OFF:
                Log.d("mypackage", "ACTION_SCREEN_OFF");
                break;
            case Intent.ACTION_BOOT_COMPLETED:
                Log.d("mypackage", "ACTION_BOOT_COMPLETED");
                break;
            case Intent.ACTION_USER_PRESENT:
                Log.d("mypackage", "ACTION_USER_PRESENT");
                break;
        }

    }

但问题是......它有效但效果不佳...... 有时,在用户操作后,阅读消息会有几秒钟的延迟。 有时,甚至不会出现日志消息...

它与我的代码实现有关吗?还是只是android性能不佳? 请帮帮我~

【问题讨论】:

    标签: android android-intent broadcastreceiver action


    【解决方案1】:

    这实际上取决于广播执行期间应用程序的状态以及执行应用程序的 Android 操作系统版本。

    请记住,BroadcastReceiver 在 UI 线程中执行。如果您的应用程序正在执行任何繁重的任务,同时您尝试在接收器中处理您的事件,则处理速度会很慢。在 UI 线程循环器空闲之前,您将看到事件如何没有到达您的接收器,或者在您的接收器处理事件之前,您的 UI 是如何冻结的。

    我建议您检查一下,如果您同时将事件扔给您的接收器,您的应用程序正在 UI 线程中执行某些操作。

    为了在不同的设备和 Android 操作系统版本中监控我的应用程序,我使用了我正在开发的工具http://flowup.io,使用此工具我可以控制我的应用程序中的帧速率。理想情况下,我们应该有 60 fps,但这并不总是可能的 :)。这里有一个基于不同设备和不同 Android 操作系统版本的应用程序性能示例:

    如您所见,在某些时候 fps 非常低。那是因为我在 UI 线程 xD 中对包含 1000 个元素的列表进行排序的服务中存在错误。

    我建议您监控您的应用,并检查您的问题是否与接收器直接相关,或者应用在 UI 线程中执行代码的其余部分是否应该在 UI 线程之外执行。由于此工具仍在开发中,您可以使用其他已发布的工具:traeview、systrace 或 Android Studio 性能监视器。如果需要,您可以订阅邮件列表以了解第一个版本的发布时间。

    如果您仍然需要发送事件,您可以使用其他替代方法,如 otto 或 busevent 来代替广播使用。如果您发送的事件不依赖于应用程序生命周期,则可以使用此库。

    【讨论】:

      【解决方案2】:

      主要是系统。在不同设备上看到相同意图的不同接收时间。这很烦人,但您无能为力。

      “即使在正常广播的情况下,系统也可能在某些 情况恢复为一次传送一个接收器的广播。 特别是对于可能需要创建 进程,一次只会运行一个,以避免超载 具有新流程的系统。然而,在这种情况下,无序 语义成立:这些接收者仍然不能返回结果或中止 他们的广播。”

      https://developer.android.com/reference/android/content/BroadcastReceiver.html

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
      • 更新了响应。
      【解决方案3】:

      这里是准确的代码

      @Override
      public void onReceive(Context context, Intent intent) {
      
          if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
              Log.e("In on receive", "In Method:  ACTION_SCREEN_OFF");
              countPowerOff++;
      
          } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
              Log.e("In on receive", "In Method:  ACTION_SCREEN_ON");
          } else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
              Log.e("In on receive", "In Method:  ACTION_USER_PRESENT");
              if (countPowerOff > 2) {
                  countPowerOff = 0;
              }
          }
      }
      

      如果您有任何问题,请告诉我?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多