1. 程式人生 > >Android 後臺Service : 向伺服器傳送心跳包

Android 後臺Service : 向伺服器傳送心跳包

帶有心跳包的簡單Demo,包括伺服器    http://git.oschina.net/fengcunhan/SocketTest/blob/master/SocketTestService/src/com/mina/MinaServer.java?dir=0&filepath=SocketTestService%2Fsrc%2Fcom%2Fmina%2FMinaServer.java&oid=599789369632a6a2e8a31297c0cf10f85605a82c&sha=debc947b8ffa9433064384eacc01065b73aaa7b1

http://blog.csdn.net/dreamer0924/article/details/7705144

[java] 

public class HeartbeatService extends Service implements Runnable   {       private Thread          mThread;       public int              count           = 0;       private boolean         isTip           = true;       private static String   mRestMsg;       private static String   KEY_REST_MSG    = "KEY_REST_MSG";       @Override       public void run()       {           while (true)           {               try               {                   if (count > 1)                   {                       Log.i("@qi", "offline");                       count = 1;                       if (isTip)                       {                           //判斷應用是否在執行                            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);                           List<RunningTaskInfo> list = am.getRunningTasks(3);                           for (RunningTaskInfo info : list)                           {                               if (info.topActivity.getPackageName().equals("org.yhn.demo"))                               {                                   //通知應用,顯示提示“連線不到伺服器”                                    Intent intent = new Intent("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 (InterruptedException e)               {                   e.printStackTrace();               }           }       }       private void sendHeartbeatPackage(String msg)       {           HttpGet httpGet = new HttpGet(msg);           DefaultHttpClient httpClient = new DefaultHttpClient();           // 傳送請求            HttpResponse httpResponse = null;           try           {               httpResponse = httpClient.execute(httpGet);           }           catch (Exception e)           {               e.printStackTrace();           }           if (httpResponse == null)           {               return;           }           // 處理返回結果            final int responseCode = httpResponse.getStatusLine().getStatusCode();           if (responseCode == HttpStatus.SC_OK)           {               //只要伺服器有迴應就OK                count = 0;               isTip = true;           }           else           {               Log.i("@qi", "responseCode " + responseCode);           }       }       @Override       public IBinder onBind(Intent intent)       {           return null;       }       @Override       public void onCreate()       {           super.onCreate();       }       @Override       public void onDestroy()       {           super.onDestroy();       }       public void onStart(Intent intent, int startId)       {           Log.i("@qi", "service onStart");           //從本地讀取伺服器的URL,如果沒有就用傳進來的URL            mRestMsg = getRestMsg();           if (mRestMsg == null || mRestMsg == "")           {               mRestMsg = intent.getExtras().getString("url");           }           setRestMsg(mRestMsg);           mThread = new Thread(this);           mThread.start();           count = 0;           super.onStart(intent, startId);       }       public String getRestMsg()       {           SharedPreferences prefer = getSharedPreferences("settings.data", Context.MODE_PRIVATE);           Log.i("@qi", "getRestMsg() " + prefer.getString(KEY_REST_MSG, ""));           return prefer.getString(KEY_REST_MSG, "");       }       public void setRestMsg(String restMsg)       {           SharedPreferences prefer = getSharedPreferences("settings.data", Context.MODE_PRIVATE);           SharedPreferences.Editor editor = prefer.edit();           editor.putString(KEY_REST_MSG, restMsg);           editor.commit();       }   }   public class HeartbeatService extends Service implements Runnable { private ThreadmThread; public intcount= 0; private booleanisTip= true; private static StringmRestMsg; private static StringKEY_REST_MSG= "KEY_REST_MSG"; @Override public void run() { while (true) { try { if (count > 1) { Log.i("@qi", "offline"); count = 1; if (isTip) { //判斷應用是否在執行 ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> list = am.getRunningTasks(3); for (RunningTaskInfo info : list) { if (info.topActivity.getPackageName().equals("org.yhn.demo")) { //通知應用,顯示提示“連線不到伺服器” Intent intent = new Intent("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 (InterruptedException e) { e.printStackTrace(); } } } private void sendHeartbeatPackage(String msg) { HttpGet httpGet = new HttpGet(msg); DefaultHttpClient httpClient = new DefaultHttpClient(); // 傳送請求 HttpResponse httpResponse = null; try { httpResponse = httpClient.execute(httpGet); } catch (Exception e) { e.printStackTrace(); } if (httpResponse == null) { return; } // 處理返回結果 final int responseCode = httpResponse.getStatusLine().getStatusCode(); if (responseCode == HttpStatus.SC_OK) { //只要伺服器有迴應就OK count = 0; isTip = true; } else { Log.i("@qi", "responseCode " + responseCode); } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } public void onStart(Intent intent, int startId) { Log.i("@qi", "service onStart"); //從本地讀取伺服器的URL,如果沒有就用傳進來的URL mRestMsg = getRestMsg(); if (mRestMsg == null || mRestMsg == "") { mRestMsg = intent.getExtras().getString("url"); } setRestMsg(mRestMsg); mThread = new Thread(this); mThread.start(); count = 0; super.onStart(intent, startId); } public String getRestMsg() { SharedPreferences prefer = getSharedPreferences("settings.data", Context.MODE_PRIVATE); Log.i("@qi", "getRestMsg() " + prefer.getString(KEY_REST_MSG, "")); return prefer.getString(KEY_REST_MSG, ""); } public void setRestMsg(String restMsg) { SharedPreferences prefer = getSharedPreferences("settings.data", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefer.edit(); editor.putString(KEY_REST_MSG, restMsg); editor.commit(); } } 啟動Service: [java]   Intent serviceIntent = new Intent("HeartbeatService");   serviceIntent.putExtra("url",url);   startService(serviceIntent);   Intent serviceIntent = new Intent("HeartbeatService"); serviceIntent.putExtra("url",url); startService(serviceIntent); 最後別忘了註冊Server和GET_TASKS [html]   <service               android:name=".demo.HeartbeatService"               android:label="QServer"               android:persistent="true" >               <intent-filter>                   <action android:name="HeartbeatService" />               </intent-filter>           </service>   <service             android:name=".demo.HeartbeatService"             android:label="QServer"             android:persistent="true" >             <intent-filter>                 <action android:name="HeartbeatService" />             </intent-filter>         </service>[html] view plaincopyprint? <uses-permission android:name="android.permission.GET_TASKS" />   <uses-permission android:name="android.permission.GET_TASKS" /> 執行效果: \