GCM推播與螢幕喚醒

上週接到要修改某點餐系統APP,花了一整天在了解GCM的推播
試著解決

Q1.螢幕關閉後不會接收到系統推播的問題
A1.若確定APP端在螢幕喚醒時能正常接收到推播,那問題有可能出在Server端

剛接收到問題時,花了一天修改程式,仍然無法解決這個問題,後來發現問題出在系統端,主因於Server端發送的指令,造成程式在處理上會有不提醒的狀態,因此修改伺服器端的程式便修正完成

Q1的問題解決後,又遇到新的問題,雖然螢幕關閉的狀態下會收到提示,但是螢幕不會喚醒來提示,似乎仍然不太符合客戶的需求,因此再進行修改WakeLock的工程

Q2. 螢幕接收到推播不會亮起
A2. 參考 http://stackoverflow.com/questions/35240524/getting-error-acquiring-wakelock-while-getting-regid-in-gcm該網址中的 // Wake Android Device when notification received
程式碼
--
   // Wake Android Device when notification received
   PowerManager pm = (PowerManager) context
     .getSystemService(Context.POWER_SERVICE);
   final PowerManager.WakeLock mWakelock = pm.newWakeLock(
     PowerManager.FULL_WAKE_LOCK
       | PowerManager.ACQUIRE_CAUSES_WAKEUP, "GCM_PUSH");
   mWakelock.acquire();
--
添加入程式碼中,並做適度的修改後解決該問題
--
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);final PowerManager.WakeLock mWakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");mWakelock.acquire(15000);


--
喚醒時間有兩種做法來控制
方法一. acquire()後接releass()來控制關閉(秒數短,約6秒後即關閉)
方法二. acquire(1000)裡面放入數字,來控制秒數 內容為毫秒(10的-3次方,故1秒為1000毫秒) ,時間到會自動關閉(內容可參照http://developer.android.com/reference/android/os/PowerManager.WakeLock.html)

注意!單純只下acquire()的話,會造成螢幕一直喚醒不會關閉,記得要再下releass來控制關閉控。如果客戶需求喚醒較久的秒數可以由acquire()中來調整,使用releass來控制關閉的秒數是固定的。

留言

  1. hi,手機關閉螢幕5分鐘後進入休眠狀態,
    收到gcm後 WakefulBroadcastReceiver 沒有作用
    所以之後Intent service 無法取得wakelock把螢幕喚醒
    請問您是怎麼解決的,thanks

    回覆刪除
  2. 找到原因了,除了要設wakelock,payload上的priority要設High

    回覆刪除

張貼留言

這個網誌中的熱門文章

Android 在Fragment下控制輸入鍵盤

jQuery獲取Select選擇的Text和Value(轉)

彈跳視窗iframe的運用