2016-10-20 64 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來替換廣播使用情況。如果您發送的事件不依賴於應用程序生命週期,則可以使用此庫。