2012-03-22 41 views
5

我有Activity在單模式和C2DM接收器中運行。在某些通知我需要運行活動,我做它通過這種方式:處理onNewIntent FLAG_ACTIVITY_NEW_TASK

Intent activity = new Intent(context, klass); 
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
context.startActivity(activity); 

活動時,如果背景(如Home鍵之前按下),一切工作正常。 但是當我剛按下電源按鈕關閉屏幕時,運行活動無法通知有關更改(onNewIntent從未調用過)。

如何通知有關通知的運行活動?

+0

我會建議不要僅在onCreate中更新您的UI,但也可以使用onResume。不過,我覺得這個問題太模糊了,我不確定我們有什麼需要回答的。給一些活動代碼,主要方法。 – Snicolas 2012-03-22 05:09:12

+0

電話被鎖定,並且活動似乎在前臺並且沒有重新啓動,onResume',onCreate'和'onNewIntent'不被調用 – skayred 2012-03-22 05:21:00

+0

您可能會考慮使用服務,也許有一些網絡鎖定以確保您仍然收到c2dm通知。 – Snicolas 2012-03-22 05:25:25

回答

4

Skayred, 我相信我有完全相同的情況。然而,我注意到,當手機睡着了,新的意圖被髮送到活動,它不會啓動活動,直到屏幕上(爲我的目的,我想要的屏幕上)。

我的解決方案是在我的C2DM接收器中獲取喚醒鎖。

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,  TAG); 
mWakeLock.acquire(); 

當然,一定要在你的活動,以釋放mWakeLock.release()鎖。

這是奇怪的行爲,它似乎不符合其他Android活動行爲。在我的情況下,我正在使用singleTask活動(我不確定您使用的是哪種類型的活動,您沒有說明)。如果沒有在堆棧的頂部的活動的一個實例,且手機是睡着了我的活動將啓動,我可以使用下面在OnCreate():

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

但是,如果活動是堆棧的頂部和手機處於睡眠狀態,直到打開屏幕纔開始活動。希望這對你有用。如果你不需要屏幕出現,我會嘗試使用其他的喚醒符號。

1

根據您的配置,這應該工作:

  • 構建一個應用程序類作爲一個單身,以後你可以很容易地訪問它
  • 給它一個數據成員是一個數據模型,這將是訪問無論從C2DM通知接收機以及所有acitivies
  • 根據觀察到的觀察者設計模式
  • 建立數據模型的C2DM通知將改變模型
  • 個活動,在的onCreate會堵塞事件偵聽器,的onDestroy
  • 當模型改變它觸發一個事件,給所有的聽衆,和活動,在拔出時,他們收到的情況下,更新他們的UI

這是一個也是在您的應用中獲得更好設計的好機會。