當前位置:首頁 » 安卓系統 » android心跳包

android心跳包

發布時間: 2022-09-21 08:37:01

㈠ android 如何使用Wake Lock來節電

android 使用Wake Lock來節電方法:
默認情況下,Android設備會在一段時間後使屏幕變暗,然後關閉屏幕顯示,最後停止CPU,有時用戶並不希望如此,因此Android提供了WakeLock類讓用戶實現自定義的電源管理,但是如果不合理使用這個功能,應用程序造成的電池電量消耗產生顯著的影響,所以建議當用戶觀看屏幕但是很少與屏幕進行交互時(如看視頻)使用,從而防止屏幕變暗。
如果一開始就對Android手機的硬體架構有一定的了解,設計出的應用程序通常不會成為待機電池殺手,而要設計出正確的通信機制與通信協議也並不困難。但如果不去了解而盲目設計,可就沒准了。
首先Android手機有兩個處理器,一個叫Application Processor(AP),一個叫Baseband Processor(BP)。AP是ARM架構的處理器,用於運行Linux+Android系統;BP用於運行實時操作系統(RTOS),通訊協議棧運行於BP的RTOS之上。非通話時間,BP的能耗基本上在5mA左右,而AP只要處於非休眠狀態,能耗至少在50mA以上,執行圖形運算時會更高。另外LCD工作時功耗在100mA左右,WIFI也在100mA左右。一般手機待機時,AP、LCD、WIFI均進入休眠狀態,這時Android中應用程序的代碼也會停止執行。
Android為了確保應用程序中關鍵代碼的正確執行,提供了Wake Lock的API,使得應用程序有許可權通過代碼阻止AP進入休眠狀態。但如果不領會Android設計者的意圖而濫用Wake Lock API,為了自身程序在後台的正常工作而長時間阻止AP進入休眠狀態,就會成為待機電池殺手。比如前段時間的某應用,比如現在仍然干著這事的某應用。

㈡ 如何避免拖延Android的GCM消息/更改心跳

關於這個問題,我做個gcm,如果不對於心跳包進行實際間隔的更改,延遲會比較嚴重,可以參考一下我的csdn的博客:你好邱林和,裡面有一篇文章講到了。

㈢ 什麼是心跳包!

一般是用來判斷對方(設備,進程或其它網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。一般是用來判斷對方(設備,進程或其它網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。基本原因是伺服器端不能有效的判斷客戶端是否在線也就是說,伺服器無法區分客戶端是長時間在空閑,還是已經掉線的情況.所謂的心跳包就是客戶端定時發送簡單的信息給伺服器端告訴它我還在而已。代碼就是每隔幾分鍾發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鍾內沒有收到客戶端信息則視客戶端斷開。比如有些通信軟體長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。伺服器也可以定時輪詢發心跳下去。一般來說,出於效率的考慮,是由客戶端主動向伺服器端發包,而不是

就是在客戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。

就是定時發送給對方一個數據包,告訴對方自己還在維護對話,同時獲得返回的數據,判斷對方是否在會話中。

客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,伺服器收到後,就知道當前客戶端還處於「活著」的狀態,否則,如果隔一定時間未收到這樣的包,則伺服器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。

㈣ 請問如何在android下計算出心跳包的發送頻率

[圖文]2013年2月2日 - //向伺服器發送心跳包 sendHeartbeatPackage(...點擊復制鏈接 與好友分享!回本站首頁 分享到:...java程序移植到android上問題解決小結Android入門第...

㈤ android 心跳包伺服器怎麼寫

[java]

{
privateThreadmThread;
publicintcount=0;
privatebooleanisTip=true;
privatestaticStringmRestMsg;
privatestaticStringKEY_REST_MSG="KEY_REST_MSG";

@Override
publicvoidrun()
{
while(true)
{
try
{
if(count>1)
{
Log.i("@qi","offline");
count=1;
if(isTip)
{
//判斷應用是否在運行
ActivityManageram=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo>list=am.getRunningTasks(3);
for(RunningTaskInfoinfo:list)
{
if(info.topActivity.getPackageName().equals("org.yhn.demo"))
{
//通知應用,顯示提示「連接不到伺服器」
Intentintent=newIntent("org.yhn.demo");
intent.putExtra("msg",true);
sendBroadcast(intent);
break;
}
}

isTip=false;
}
}
if(mRestMsg!=""&&mRestMsg!=null)
{
//向伺服器發送心跳包
sendHeartbeatPackage(mRestMsg);
count+=1;
}

Thread.sleep(1000*3);
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}

(Stringmsg)
{
HttpGethttpGet=newHttpGet(msg);
DefaultHttpClienthttpClient=newDefaultHttpClient();
//發送請求
HttpResponsehttpResponse=null;
try
{
httpResponse=httpClient.execute(httpGet);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(httpResponse==null)
{
return;
}

//處理返回結果
finalintresponseCode=httpResponse.getStatusLine().getStatusCode();
if(responseCode==HttpStatus.SC_OK)
{
//只要伺服器有回應就OK
count=0;
isTip=true;
}
else
{
Log.i("@qi","responseCode"+responseCode);
}

}

@Override
publicIBinderonBind(Intentintent)
{
returnnull;
}


@Override
publicvoidonCreate()
{
super.onCreate();
}@Override
publicvoidonDestroy()
{
super.onDestroy();
}

publicvoidonStart(Intentintent,intstartId)
{
Log.i("@qi","serviceonStart");
//從本地讀取伺服器的URL,如果沒有就用傳進來的URL
mRestMsg=getRestMsg();
if(mRestMsg==null||mRestMsg=="")
{
mRestMsg=intent.getExtras().getString("url");
}
setRestMsg(mRestMsg);

mThread=newThread(this);
mThread.start();
count=0;

super.onStart(intent,startId);
}

publicStringgetRestMsg()
{
SharedPreferencesprefer=getSharedPreferences("settings.data",Context.MODE_PRIVATE);
Log.i("@qi","getRestMsg()"+prefer.getString(KEY_REST_MSG,""));
returnprefer.getString(KEY_REST_MSG,"");
}

publicvoidsetRestMsg(StringrestMsg)
{
SharedPreferencesprefer=getSharedPreferences("settings.data",Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=prefer.edit();
editor.putString(KEY_REST_MSG,restMsg);
editor.commit();
}

}


{
privateThreadmThread;
publicintcount=0;
privatebooleanisTip=true;
privatestaticStringmRestMsg;
privatestaticStringKEY_REST_MSG="KEY_REST_MSG";

@Override
publicvoidrun()
{
while(true)
{
try
{
if(count>1)
{
Log.i("@qi","offline");
count=1;
if(isTip)
{
//判斷應用是否在運行
ActivityManageram=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo>list=am.getRunningTasks(3);
for(RunningTaskInfoinfo:list)
{
if(info.topActivity.getPackageName().equals("org.yhn.demo"))
{
//通知應用,顯示提示「連接不到伺服器」
Intentintent=newIntent("org.yhn.demo");
intent.putExtra("msg",true);
sendBroadcast(intent);
break;
}
}

isTip=false;
}
}
if(mRestMsg!=""&&mRestMsg!=null)
{
//向伺服器發送心跳包
sendHeartbeatPackage(mRestMsg);
count+=1;
}

Thread.sleep(1000*3);
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}

(Stringmsg)
{
HttpGethttpGet=newHttpGet(msg);
DefaultHttpClienthttpClient=newDefaultHttpClient();
//發送請求
HttpResponsehttpResponse=null;
try
{
httpResponse=httpClient.execute(httpGet);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(httpResponse==null)
{
return;
}

//處理返回結果
finalintresponseCode=httpResponse.getStatusLine().getStatusCode();
if(responseCode==HttpStatus.SC_OK)
{
//只要伺服器有回應就OK
count=0;
isTip=true;
}
else
{
Log.i("@qi","responseCode"+responseCode);
}

}

@Override
publicIBinderonBind(Intentintent)
{
returnnull;
}


@Override
publicvoidonCreate()
{
super.onCreate();
}@Override
publicvoidonDestroy()
{
super.onDestroy();
}

publicvoidonStart(Intentintent,intstartId)
{
Log.i("@qi","serviceonStart");
//從本地讀取伺服器的URL,如果沒有就用傳進來的URL
mRestMsg=getRestMsg();
if(mRestMsg==null||mRestMsg=="")
{
mRestMsg=intent.getExtras().getString("url");
}
setRestMsg(mRestMsg);

mThread=newThread(this);
mThread.start();
count=0;

super.onStart(intent,startId);
}

publicStringgetRestMsg()
{
SharedPreferencesprefer=getSharedPreferences("settings.data",Context.MODE_PRIVATE);
Log.i("@qi","getRestMsg()"+prefer.getString(KEY_REST_MSG,""));
returnprefer.getString(KEY_REST_MSG,"");
}

publicvoidsetRestMsg(StringrestMsg)
{
SharedPreferencesprefer=getSharedPreferences("settings.data",Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=prefer.edit();
editor.putString(KEY_REST_MSG,restMsg);
editor.commit();
}

}


啟動Service:


[java]
IntentserviceIntent=newIntent("HeartbeatService");
serviceIntent.putExtra("url",url);
startService(serviceIntent);

IntentserviceIntent=newIntent("HeartbeatService");
serviceIntent.putExtra("url",url);
startService(serviceIntent);
最後別忘了注冊Server和GET_TASKS


[html]
<service
android:name=".demo.HeartbeatService"
android:label="QServer"
android:persistent="true">
<intent-filter>
<actionandroid:name="HeartbeatService"/>
</intent-filter>
</service>

<service
android:name=".demo.HeartbeatService"
android:label="QServer"
android:persistent="true">
<intent-filter>
<actionandroid:name="HeartbeatService"/>
</intent-filter>
</service>[html]viewplainprint?
<uses-permissionandroid:name="android.permission.GET_TASKS"/>

<uses-permissionandroid:name="android.permission.GET_TASKS"/>

㈥ Android推送中心跳和輪詢的區別

輪詢耗費性能,因為每次輪詢都要經過一次TCP的連接和斷開。

輪詢是為了獲取數據,而心跳包是為了保活TCP連接,防止NAT超時(內網和外網的映射表)

輪詢設定的時間大小決定了數據獲取的及時性,心跳包的發送時間間隔和數據的及時性沒有太大的關系,如果心跳包發送的時間間隔大於NAT淘汰的時間會導致長連接斷開。

㈦ android手機連接無線模塊幾小時後發生Software caused connection abort異常 導致連接被拒絕 怎麼解決

java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:182)

發生這個異常,從異常提示看是由於程序引起的,而非網路方面的原因,引發該異常的
場景之一:
客戶機<-->伺服器,之間是由一個socket 長連接來通信,客戶端有一個接收線程在while(true){..}循環里不停地從InputStream流中讀數據,客戶機每隔幾秒鍾發一次心跳包至服務端,如果連續未收到心跳包響應的次數已達到規定的次數,客戶機認為此鏈路異常,將socket關閉,那麼伺服器會拋出java.net.SocketException: Connection reset by peer異常,然後分配給此socket連接的線程退出,那麼客戶端在while(true){..}循環,讀取流時便會發java.net.SocketException:Software caused connection abort: recv failed異常。
已知會導致這種異常的一個場景如下:
客戶端和服務端建立tcp的短連接,每次客戶端發送一次請求,
服務端響應後關閉與客戶端的連接.
如果客戶端在服務端關閉連接後,沒有釋放連接,繼續試圖發送請求和接收響應.
這個時候就會出錯.

這個時候客戶端Socket的getOutputStream返回來的OutPutStream維護
的是本地的連接狀態,
無法知道遠程的服務端已經關閉了對應的InputStream和socket因此
雖然調用了
out.write(sendbuf, 0, sendbuf.length);
方法,但是實際上服務端並沒有接收到客戶端的請求信息.
因為沒有拋出異常,因此造成了誤以為客戶端請求發送成功的假象.

接下來調用etInputStream的in.read(header, 0, 14);方法.
因為這次要讀取服務端的信息,因此產生了
Software caused connection abort: recv failed的異常

總結產生原因,在服務端/客戶端單方面關閉連接的情況下,另一方依然以為
tcp連接仍然建立,試圖讀取對方的響應數據,導致出現
Software caused connection abort: recv failed的異常.

因此在receive數據之前,要先判斷連接狀態.
通過inputstream的available()方法來判斷,是否有響應結果.
如果available()的返回值為0,說明沒有響應數據,可能是對方已經斷開連接,
如果available()的返回值大於0,說明有響應數據.
另外值得注意的是available()返回的值是非堵塞的,可以被多個線程訪問

在對方釋放連接後,也要釋放本地的連接.

㈧ android 消息推送是什麼,消息推送一般是怎麼做的

是從伺服器不定的向手機客戶端即時推送各種通知消息。消息推送方法是:
1、可以通過SMS進行伺服器端和客戶端的交流通信。 可以通過攔截SMS消息並且解析消息內容來了解伺服器的意圖,可以實現完全的實時操作。
3、循環主動定時獲取
這種方法是需要客戶端來做一個定時或者周期性的訪問伺服器端介面,來獲得最新的消息。
3、持久連接
這個方案雖然可以解決由輪詢帶來的性能問題等各種問題,但是還是會消耗手機的電池。
消息推送可以選擇深圳極光,是一個不錯的軟體;也是是國內領先的移動開發者服務提供商。極光通過該一體化消息下發平台,助力行業客戶實現多通道高效精準觸達目標用戶。截至2021年3月,已有超173.1萬款APP在使用極光提供的服務。

㈨ android6.0 微信心跳包多久一次

在支持GCM的設備上,主要靠GCM來激活WhatsApp,WhatsApp啟動後,會建立一個與伺服器的長連接,直接通過此長連接發送Push消息,這個長連接10分鍾無消息就會主動斷掉,且這十分鍾內不做心跳,斷掉後WhatsApp客戶端和它的伺服器不再有連接。當有消息時候,伺服器發現沒有長連接會發送GCM消息,手機收到GCM消息後,會重新建立長連接來收取消息,10分鍾無消息會再斷開,如此循環。

㈩ android socket tcp 為什麼要發送心跳包

後台開啟一個線程一直運行,每隔1分鍾左右發送一個心跳報文給伺服器,以確保時刻跟伺服器鏈接。若超過3次伺服器未對客戶端發送的心跳報文做出回應則重新鏈接。 如果這么作的話,必須確保和伺服器達成一定的應用層協議。

熱點內容
搭建國外伺服器需要多少錢 發布:2025-01-12 13:08:01 瀏覽:826
我的世界mod伺服器開荒 發布:2025-01-12 13:07:10 瀏覽:756
sql優化書 發布:2025-01-12 13:07:09 瀏覽:454
高校網站伺服器搭建與維護論文 發布:2025-01-12 13:06:31 瀏覽:710
sqlserver實例沒有 發布:2025-01-12 12:57:18 瀏覽:251
代碼文件伺服器地址怎麼寫 發布:2025-01-12 12:50:47 瀏覽:759
java中方法與 發布:2025-01-12 12:50:13 瀏覽:654
如何快速查找c語言編譯時的錯 發布:2025-01-12 12:49:56 瀏覽:31
看門狗上傳病毒 發布:2025-01-12 12:32:54 瀏覽:326
網路登錄伺服器需要獲取什麼信息 發布:2025-01-12 12:17:32 瀏覽:892