Android 后台Service : 向服务器发送心跳包

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();
	}

}


启动Service:

		Intent serviceIntent = new Intent("HeartbeatService");
		serviceIntent.putExtra("url",url);
		startService(serviceIntent);


最后别忘了注册Server和GET_TASKS

<service
            android:name=".demo.HeartbeatService"
            android:label="QServer"
            android:persistent="true" >
            <intent-filter>
                <action android:name="HeartbeatService" />
            </intent-filter>
        </service>
<uses-permission android:name="android.permission.GET_TASKS" />


运行效果:




  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
TCP协议发送心跳包的方式与UDP协议略有不同,需要在保持TCP连接的同时发送心跳包。 以下是一个使用TCP协议向服务器发送心跳包的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <errno.h> #include <signal.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8888 #define HEARTBEAT_INTERVAL 10 // 心跳包发送间隔,单位为秒 #define MAX_RETRY_TIMES 3 // 最大重试次数 volatile sig_atomic_t can_exit = 0; // 是否可以退出程序的标志 void sigint_handler(int signum) { can_exit = 1; } int heartbeat(int sockfd) { int ret, retry_times; char buf[1024] = "heartbeat"; while (!can_exit) { // 向服务器发送心跳包 ret = send(sockfd, buf, strlen(buf), 0); if (ret <= 0) { perror("send"); return -1; } printf("send heartbeat\n"); sleep(HEARTBEAT_INTERVAL); // 接收服务器响应 char recv_buf[1024]; ret = recv(sockfd, recv_buf, sizeof(recv_buf), MSG_DONTWAIT); if (ret < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // 未收到响应,继续发送心跳包 continue; } else { perror("recv"); return -1; } } else if (ret == 0) { // 连接已断开,需要重新连接 printf("connection closed\n"); return -1; } else { // 收到服务器响应,重置重试次数 retry_times = 0; } // 如果连续多次未收到服务器响应,则认为连接已断开 retry_times++; if (retry_times > MAX_RETRY_TIMES) { printf("no response from server\n"); return -1; } } return 0; } int main() { int sockfd; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); exit(-1); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); // 建立TCP连接 int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret < 0) { perror("connect"); exit(-1); } // 注册SIGINT信号处理函数,以便在收到Ctrl+C信号时可以安全退出程序 signal(SIGINT, sigint_handler); // 开始发送心跳包 heartbeat(sockfd); close(sockfd); return 0; } ``` 该示例中,使用TCP协议向服务器发送心跳包心跳包内容为字符串"heartbeat",发送间隔为10秒。在程序开始时,先建立TCP连接。然后进入心跳包发送循环,不断发送心跳包,同时接收服务器的响应。如果连续多次未收到服务器响应,则认为连接已断开,需要重新连接。如果收到服务器的响应,则重置重试次数。在程序收到Ctrl+C信号时,设置can_exit标志,以便安全退出程序。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值