2012-07-02 79 views
6

我的VOIP Android應用程序已經在C /本地庫,其不登錄的所有業務邏輯/註銷等UDP/RTCP包沒有到達設備/應用Whens設備屏幕被鎖定

問題與此是當設備屏幕被鎖定的應用程序(c代碼)無法從服務器接收任何數據包。我用Wireshark驗證了這一點。它看起來像CPU沒有運行。

我能夠解決在我的應用程序INIT下面做的問題。

WakeLock mWakeLock = null; 
PowerManager pm = (PowerManager) cxt.getSystemService(Context.POWER_SERVICE); 
if(mPartialWakeLock == null){ 
    // lock used to keep the processor awake. 
    mPartialWakeLock = pm.newWakeLock(
     PowerManager.PARTIAL_WAKE_LOCK 
      | PowerManager.ON_AFTER_RELEASE, TAG); 
    mPartialWakeLock.acquire; 
} 

但是,以上操作會耗盡我的電池。

爲什麼這些請求沒有到達我的應用程序?當屏幕被鎖定並接收來自服務器的請求時,我怎樣才能使設備CPU始終處於運行狀態?

注: EDITED 使用設備:三星智能橄欖球i847 操作系統:Android操作系統,v2.3.6(Gingerbread.UCLA4)

的應用程序的工作有關Galaxy S2(是不是因爲它的雙核處理器並且屏幕鎖定中的CPU已啓動?) SKYPE和VIBER如何將WRT設計爲睡眠模式?

+1

使用喚醒電纜並排出電池;否則不要試圖做到這一點。或者決定C2DM是否能夠滿足您的需求。這是在電池上運行的折衷! –

+2

C2DM不會爲我的事業服務..任何其他你可以建議克里斯! – NitZRobotKoder

+0

也許你的設備有保存電池設置,當屏幕鎖定時關閉網絡? – xtr

回答

1

您是否考慮使用service

Service爲應用程序告訴系統有關的東西,它希望在背景(即使用戶不直接與應用程序交互)在做提供便利。通過啓動它,系統將安排服務的工作,直到服務或其他人明確停止它爲止。

我想這能幫助..乾杯

編輯: 衝,U以前沒提服務..我仍然不知道如果u有兩個問題(電池耗盡,而不是接收數據)還是隻有一個你接收數據與漏.. ..?

考慮到電池電量耗盡,你可以試用WAKE_LOCK的不同標誌。

我注意到重要的是,你沒有發佈鎖與mPartialWakeLock.release()爲勸鏈接WAKE_LOCK頁:

設備的電池壽命會利用此API 來顯著影響。除非您確實需要它們,否則不要購買WakeLocks,儘可能使用最低等級的 ,並且一定要儘快將其釋放。

此外,根據一些其他posts,電池消耗速度取決於工作的事情UR在服務做效果,所以這是我們不能夠幫助沒有看到更多的代碼..:S

Btw ..恕我直言,如果你只是等待來電,並保持WAKE_LOCK所有的時間,這可能是電池耗盡的原因。想想你需要什麼,並儘量減少資源的使用,如果你不需要他們..以WIFI_LOCK爲例,並儘快發佈WAKE_LOCK ..

+0

我確實有服務,問題是我的C/Native代碼是從服務器接收請求的人,然後它將它提交給我的Android應用層(UI),這裏的請求沒有達到C/Native代碼CPU沒有運行。 – NitZRobotKoder

+0

現在我明白了..:S – Ewoks

+0

任何你可以添加Ewoks! – NitZRobotKoder

1

我正在開發一個類似的應用程序,該應用程序運行的服務在啓動時與服務器建立持久的TCP連接,以便能夠從服務器接收消息服務器。該服務不會獲取任何鎖。這部分應用程序已經在不久前實現了,到目前爲止,我沒有任何問題無法從服務器接收消息。看完你的問題後,我決定測試爲什麼我沒有這個問題。

我認爲,即使我沒有持有任何鎖,也許有其他應用程序,因此保持活着的CPU。運行adb shell dumpsys,我注意到情況並非如此:mLocks.size=0

這意味着即使設備處於睡眠狀態,應用程序仍然能夠接收數據包。我無法在此找到任何官方的,但在互聯網上的幾個職位似乎達成了共識:

雖然我還沒有發現在那裏,這是記錄在案的一個很好的例子,似乎即使你的手機是睡着了,如果在連接上接收數據時,您的代碼將被喚醒[...](source


>說,該裝置是在深睡眠和網絡棧接收輸入分組。這會喚醒設備嗎?

它應該。 (source

但是,請注意,這兩個來源建議您應該獲得一個喚醒鎖來處理數據包,以防止設備在此處理過程入睡。我不會在我的應用程序(也許我應該)這樣做,但我的處理非常短。

當你說你的請求沒有到達你的應用程序時,你確定它們不是?也許他們是,但是你的應用程序在發送回覆之前就睡着了?嘗試在您的套接字上收到數據時獲取喚醒鎖,並在完成處理後釋放它。

+0

完全贊同@Artyom。我猜他的問題是使用本地代碼「登錄/註銷的所有業務邏輯等。」 - 意思是一切!這就是爲什麼他保持WAKE_LOCK時間太長,這當然會耗盡電池。 – Ewoks

+0

但是,應用程序在S2設備上的工作就像魅力!問題與三星橄欖球智能I847 – NitZRobotKoder

+0

@NitZRobotKoder也許在S2設備保持清醒足夠長的時間,以便處理完成。你有沒有嘗試過我在我的回答中提出的建議? – Artyom

0

沒有必要使用喚醒鎖,因爲它們不可靠和越野車。

這將是更有效地使用系統自帶的在通過Android的照顧管理的方式保持在屏幕上的版本:

在你的活動onCreate,這樣做:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
        WindowManager.FLAG_SHOW_WHEN_LOCKED); 

這是從開發人員的API發現here

公共靜態最終詮釋FLAG_SHOW_WHEN_LOCKED

從以下版本開始:API級別5窗口標誌:用於在屏幕鎖定時顯示窗口的特殊標誌 。這將使應用程序窗口優先於密鑰保護或任何其他鎖定屏幕,其優先級爲 。可以使用 FLAG_KEEP_SCREEN_ON開啓屏幕並直接在顯示密鑰保護窗口之前顯示窗口 。可以使用 FLAG_DISMISS_KEYGUARD自動完全駁回不安全的 保護鍵。該標誌僅適用於最頂級的全屏窗口。

恆值:524288(0x00080000)

通過它與標誌的有效畫面合成,應該讓周圍的鎖屏設備。唯一的事情是要確保您的活動是屏幕上最頂級的

引述,在

這個常量已廢棄的FLAG_KEEP_SCREEN_ONPowerManager

公共靜態最終詮釋SCREEN_BRIGHT_WAKE_LOCK的使用。大多數應用程序應該使用 FLAG_KEEP_SCREEN_ON,而不是這種類型的喚醒鎖的,因爲這將是 爲用戶 應用之間移動,不需要特別許可由正確的平臺進行管理。喚醒鎖定 確保屏幕全亮;鍵盤 背光將被允許熄滅。

0

有沒有必要創建這樣的代碼不工作 - 爲什麼你不使用一個準備好的軟件?我們使用Ozeki電話系統XE PBX和Android手機(有30個Android手機通過VoIP連接到系統),並且它們無故障工作。

檢查了這一點:Link

從未有過的問題與RTCP協議處理。如果你想嘗試試用版。

希望我能幫上忙。

0

當您的應用程序在後臺運行時,無法接收UDP數據。 因爲您的客戶端正在以組播方式發送數據。當您的移動設備屏幕被鎖定並且App在後臺運行時,在這種情況下,移動硬件會有mac過濾器和ip過濾器,它們只能接受指向屬於設備的特定IP的數據。簡單地說,你需要做單播。 例如: 有客戶端,它發送一個特定的套接字和IP數據(在你的情況下,你可以在255.255.255.255發送數據)和你的數據在特定端口上播出,如果有任何準備在接收數據的設備那個端口就像一個服務器,例如你的App就像一個服務器,如果你的應用程序在前臺運行,它就會收到數據。當你在後臺應用程序不會。

所以,你必須做的是,你必須得到設備的IP地址,你必須送您的設備IP地址的數據就意味着你要做的單播。在這個應用程序將收到數據運行後臺或前臺和您的手機屏幕鎖定。