即時接收廣播接收器的意圖,然後我開始服務做更多的工作。現在如果設備是睡眠並且發生這種情況,我必須得到Wakelock(AlarmManger?),爲什麼我需要它? 如果設備在沒有喚醒的情況下進入睡眠狀態,我的服務將停止運行。廣播接收器,服務和Wakelock
回答
現在如果設備是睡眠,這發生了什麼,我必須得到Wakelock(AlarmManger?),爲什麼我需要它?
如果設備先睡着了,您將不會「收到廣播接收方的意圖」,因爲設備處於睡眠狀態。
我必須得到Wakelock(AlarmManger?),爲什麼我需要它?
除非要確保設備在完成某些工作時保持運行狀態,否則不需要它。
如果設備在沒有獲得喚醒鎖的情況下進入睡眠狀態,我的服務將停止運行。
是的。
public class WakeLockManager extends BroadcastReceiver {
private static WakeLock mWakeLock;
private String LCLT;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) {
Log.v("wakelock", "GOT THE wakelock INTENT");
boolean on = intent.getExtras().getBoolean("on");
if (mWakeLock == null) {
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"Breeze WakeLock");
}
if (on) {
if (!mWakeLock.isHeld()) {
mWakeLock.acquire();
Log.v("wakelock", "acquiring wakelock");
}
} else {
if (mWakeLock.isHeld()) {
Log.v("wakelock", "releasing wakelock");
mWakeLock.release();
}
mWakeLock = null;
}
}
}
}
看看上面的代碼..put在一個單獨的類文件,並在您的清單中定義它的一些自定義的意圖....現在,這個類將一個自定義的意圖迴應...只是播出的意圖,你可以在你的整個應用程序打開激活鎖定或關閉,因爲激活鎖定是static..like這樣的:
public void setWakeup(boolean status) {
Intent wakelock_Intent = new Intent(CUSTOM_INTENT);
wakelock_Intent.putExtra("on", status);
this.sendBroadcast(wakelock_Intent);
}
以上將被定義在alarmmanager代碼,以便它安排一個電話
你確定這個「靜態鎖定「將不會在Receiver'class'卸載時被擦除?請參閱:http://stackoverflow.com/questions/6299283/broadcastreciever-life-cycle-static-variables#comment7376537_6299862 – 2013-04-25 15:03:25
我假設該對象不會被垃圾收集,因爲這不是一個匿名的broadcastReceiver。如果我自己分配這個對象並保持對它的一個硬引用,爲什麼它會被系統釋放?這是一個有趣的話題,請指教。 – j2emanue 2013-04-26 20:32:10
看起來像Android的本地WakefulBroadcastReceiver將是一個完美的解決方案。需要在「清醒」的方式,而擴大這種比普通廣播接收器並開始在的onReceive(服務):
startWakefulService(context, service);
,並顯示你的工作是在服務的onHandleIntent()完成 ,打電話
MyWakefulReceiver.completeWakefulIntent(intent);
- 1. 廣播接收器和服務
- 2. 服務內的廣播接收器
- 3. 廣播接收器不被服務
- 4. 從廣播接收器啓動服務
- 5. 廣播接收器未啓動服務
- 6. Android服務或廣播接收器
- 7. 廣播接收器中的WakeLock採集問題
- 8. 廣播接收器
- 9. 廣播接收器
- 10. 啓動活動和服務從廣播接收器
- 11. 我AlarmManager,廣播接收器和服務沒有啓動,
- 12. Android:廣播接收器和後臺服務
- 13. Android:廣播接收器和服務問題
- 14. Android中的廣播接收器和服務
- 15. 廣播接收器的的onReceive()未能接收由另一廣播接收器
- 16. 廣播接收器不能接收
- 17. IntentService中的廣播接收器(服務已泄漏意向接收器)
- 18. 廣播接收
- 19. GCM廣播接收器
- 20. C2DM廣播接收器
- 21. 廣播接收器僅
- 22. 廣播接收器建議
- 23. Android。廣播接收器
- 24. Android MMS廣播接收器
- 25. 起價廣播接收器
- 26. 來電廣播接收器
- 27. startActivity()從廣播接收器
- 28. 與廣播接收器
- 29. 關於廣播接收器
- 30. 註銷廣播接收器
對於第一部分,我的意思是我會收到來自C2DM的意圖,我猜你可以在設備處於睡眠狀態時收到它。然後我想運行一個服務,我想我必須讓wakelock保持運行。這些假設是否正確? – Jimmy 2011-04-15 19:15:56
@Fevos:「我的意思是我會收到C2DM的意圖,我想你可以在設備睡着的時候收到它。」 - 是的,C2DM通過無線數據(AFAIK)使用套接字連接,並且該連接上的傳入數據包將簡短*喚醒設備。 「然後我想運行一項服務,我想我必須讓wakelock繼續運行,這些假設是正確的嗎?」 - 是的,你會想要自己的'WakeLock'。只要確保完成後即可發佈。 – CommonsWare 2011-04-15 19:20:41
太棒了!謝謝。 – Jimmy 2011-04-15 19:26:35