Android BroadcaseReceiver性能(太慢而且不准确)

时间:2016-10-20 11:11:57

标签: android android-intent broadcastreceiver action

我使用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性能不佳? 请帮助我〜

3 个答案:

答案 0 :(得分:0)

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

  

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

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

答案 1 :(得分:0)

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

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

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

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

enter image description here

正如您所看到的,在某些时候fps非常低。那是因为我在服务中有一个错误,在UI线程xD中排序了1000个元素的列表。

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

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

答案 2 :(得分:0)

这里是使代码准确的代码

@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;
        }
    }
}

让我知道您是否有任何疑问?