Android 后台Service : 向服务器发送心跳包
16lz
2021-01-23
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";@Overridepublic 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){//只要服务器有回应就OKcount = 0;isTip = true;}else{Log.i("@qi", "responseCode " + responseCode);}}@Overridepublic IBinder onBind(Intent intent){return null;}@Overridepublic void onCreate(){super.onCreate();}@Overridepublic void onDestroy(){super.onDestroy();}public void onStart(Intent intent, int startId){Log.i("@qi", "service onStart");//从本地读取服务器的URL,如果没有就用传进来的URLmRestMsg = 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" />
更多相关文章
- 在iis上运行的服务器端程序,运行一段时间后,访问都只出现一行乱码,
- 分享html元素调用服务器实例
- 关于.NET后台定时服务框架的简单介绍
- 关于ASP.NET如何利用AjaxPro完成前端跟后台交互的实例分析
- .net验证后台页面是否登录实例教程
- 关于WebSocket部署服务器外网无法连接的解决方案
- 仪器设备改造技术,实现测量数据上传到服务器的功能
- 基于汇编的 C/C++ 协程(用于服务器)的实现
- C# 快速手动构建文件服务器