2016-10-20 36 views
1

我用4意图过滤的Android BroadcaseReceiver性能(太慢&不准确)

  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_USER_PRESENT
  • Intent.ACTION_BOOT_COMPLETED
制成broadcasereceiver

它的工作原理! 我收到广播消息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糟糕的表现? plz帮助我〜

回答

0

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

“即使在正常广播的情况下,该系统可以一些 在情况下恢复到在时间递送所述广播一个接收器。 特别地,对于可能需要一个 过程的创建接收器,仅一个将在时间,以避免过载 系统,新的流程运行在这种情况下,然而,非有序 语义举行。这些接收器仍不能返回结果或中止 他们的广播“。

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

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/14043456) – SiHa

+0

更新了回复。 – Alex

0

广播执行并在执行应用程序的Android操作系统版本中这真的取决于应用程序的状态。

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

我建议你,如果在同一时间你扔的事件,您的接收器应用程序正在执行在UI线程的东西审查。

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

enter image description here

正如你所看到的,在某些时候FPS是相当低的。这是因为我在一个服务中有一个错误,它在UI线程xD中排序了1000个元素的列表。

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

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