Android BroadcaseReceiver 性能(太慢且不准确)
Android BroadcaseReceiver performance (too slow & not accurate)
我用 4 个 intent 过滤器制作了 broadcasreceiver
- 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 表现不佳??
请帮帮我~
主要是系统。在不同设备上看到相同意图的不同接收时间。这很烦人,但您无能为力。
"Even in the case of normal broadcasts, the system may in some
situations revert to delivering the broadcast one receiver at a time.
In particular, for receivers that may require the creation of a
process, only one will be run at a time to avoid overloading the
system with new processes. In this situation, however, the non-ordered
semantics hold: these receivers still cannot return results or abort
their broadcast."
https://developer.android.com/reference/android/content/BroadcastReceiver.html
这实际上取决于广播执行期间应用程序的状态以及执行应用程序的 Android OS 版本。
请记住,BroadcastReceiver
是在 UI 线程中执行的。如果您的应用程序正在执行任何繁重的任务,同时您尝试在接收器中处理您的事件,那么处理起来会很慢。您将看到事件如何在 UI 线程循环程序空闲之前不会到达您的接收器,或者您的 UI 如何在您的接收器处理事件之前冻结。
我建议您检查是否在将事件抛给接收器的同时您的应用程序正在 UI 线程中执行某些操作。
为了在不同的设备和 Android OS 版本中监控我的应用程序,我使用了我正在开发的工具 http://flowup.io 使用这个工具,我可以控制我的帧速率应用程序。理想情况下,我们应该有 60 fps,但这并不总是可能的 :)。这里有一个基于不同设备和不同 Android OS 版本的应用程序性能示例:
如您所见,在某些时候 fps 非常低。那是因为我在 UI 线程 xD.
中对 1000 个元素的列表进行排序的服务中存在错误
我建议您监控您的应用程序并检查您的问题是否直接与接收器或应用程序的其余部分在 UI 线程中执行代码有关,而这应该不在 UI线程。由于此工具仍在开发中,您可以使用其他已发布的工具:traeview、systrace 或 Android Studio 性能监视器。如果需要,您可以订阅邮件列表以了解何时发布第一个版本。
如果您仍然需要发送一个事件,您可以使用其他替代方法如 otto 或 busevent 来代替广播使用。如果您发送的事件不依赖于应用程序生命周期,则可以使用此库。
这是使其准确的代码
@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;
}
}
}
如果您有任何问题,请告诉我?
我用 4 个 intent 过滤器制作了 broadcasreceiver
- 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 表现不佳?? 请帮帮我~
主要是系统。在不同设备上看到相同意图的不同接收时间。这很烦人,但您无能为力。
"Even in the case of normal broadcasts, the system may in some situations revert to delivering the broadcast one receiver at a time. In particular, for receivers that may require the creation of a process, only one will be run at a time to avoid overloading the system with new processes. In this situation, however, the non-ordered semantics hold: these receivers still cannot return results or abort their broadcast."
https://developer.android.com/reference/android/content/BroadcastReceiver.html
这实际上取决于广播执行期间应用程序的状态以及执行应用程序的 Android OS 版本。
请记住,BroadcastReceiver
是在 UI 线程中执行的。如果您的应用程序正在执行任何繁重的任务,同时您尝试在接收器中处理您的事件,那么处理起来会很慢。您将看到事件如何在 UI 线程循环程序空闲之前不会到达您的接收器,或者您的 UI 如何在您的接收器处理事件之前冻结。
我建议您检查是否在将事件抛给接收器的同时您的应用程序正在 UI 线程中执行某些操作。
为了在不同的设备和 Android OS 版本中监控我的应用程序,我使用了我正在开发的工具 http://flowup.io 使用这个工具,我可以控制我的帧速率应用程序。理想情况下,我们应该有 60 fps,但这并不总是可能的 :)。这里有一个基于不同设备和不同 Android OS 版本的应用程序性能示例:
如您所见,在某些时候 fps 非常低。那是因为我在 UI 线程 xD.
中对 1000 个元素的列表进行排序的服务中存在错误我建议您监控您的应用程序并检查您的问题是否直接与接收器或应用程序的其余部分在 UI 线程中执行代码有关,而这应该不在 UI线程。由于此工具仍在开发中,您可以使用其他已发布的工具:traeview、systrace 或 Android Studio 性能监视器。如果需要,您可以订阅邮件列表以了解何时发布第一个版本。
如果您仍然需要发送一个事件,您可以使用其他替代方法如 otto 或 busevent 来代替广播使用。如果您发送的事件不依赖于应用程序生命周期,则可以使用此库。
这是使其准确的代码
@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;
}
}
}
如果您有任何问题,请告诉我?