3

我使用commonsware WakefulIntentService做清醒的工作。 從支持庫中使用commonsware library而不是WakefulBroadcastReceiver有什麼優勢嗎?WakefulBroadcastReceiver支持庫vs cwac -commonsware喚醒

這是使用詢問服務庫

import android.support.v4.content.WakefulBroadcastReceiver;  

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // This is the Intent to deliver to our service. 
     Intent service = new Intent(context, SimpleWakefulService.class); 

     // Start the service, keeping the device awake while it is launching. 
     Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); 
     startWakefulService(context, service); 
    } 
} 

public class SimpleWakefulService extends IntentService { 
    public SimpleWakefulService() { 
     super("SimpleWakefulService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); 
     SimpleWakefulReceiver.completeWakefulIntent(intent); 
    } 
} 

This是文檔我的代碼。

  1. 它們之間有什麼不同?
  2. 我應該在哪裏使用commonsware庫而不是suport 庫?
+2

他們解決了同樣的基本問題。 'WakefulBroadcastReceiver'至少在理論上可以(使用常規的'Service'使用(小心!),因此它更加靈活。它也是Android支持包的一部分,您可能已經在使用其他的東西,因此它可以爲您節省依賴。 OTOH,在2008年4月至2013年8月之間,「WakefulBroadcastReceiver」不存在,所以WakefulIntentService是最主要的選擇。 – CommonsWare

+0

@CommonsWare,我在幾個月前看到你更新了lib。目前,你的lib比WakefulBroadCastReceiver更好嗎? – CauCuKien

+0

@CauCuKien:Rob的回答在總結差異方面做得很好。除此之外,我不知道你認爲「更好」是什麼意思。 – CommonsWare

回答

4

它們幾乎相同。

支持庫的WakefulBroadcastReceiver需要局部喚醒鎖,把鎖ID作爲額外的Intent,你都應該給一個IntentService,你必須調用completeWakefulIntent()大功告成處理時。所以獲取和釋放是在不同的地方完成的,這是一種代碼味道。

CommonsWare的WakefulIntentService確實獲取和釋放部分喚醒鎖本身。

如果您同意獲取和釋放應該在同一個地方完成,您可以將常規BroadcastReceiverWakefulIntentService結合使用。

如果你不介意這麼多,並且認爲使用一個衆所周知的庫更重要,這樣新的開發人員(或一年以內的你)不必(重新)學習新的東西,那麼使用支持庫。

更新

而且這樣的:對於WakefulBroadcastReceiver它發出警告的中斷,失去之後鎖定的可能性文檔。您需要在IntentService中獲得您自己的喚醒鎖,以防止出現這種情況。通過CommonsWare,您可以依靠它重新獲取鎖定。

+0

您提到了被中斷並失去喚醒鎖定的可能性。但我無法找到官方文件的位置。您能否給出一個鏈接或示例來檢測並獲取喚醒鎖? – CauCuKien

+1

@CauCuKien,查看[WakefulBroadcastReceiver]的開發者文檔(https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html)。有一個'SimpleWakefulService'類的例子,函數'onHandleIntent(Intent intent)'裏面的註釋'警告這種可能性:「注意當使用這種方法時......」 –