• 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();  
        }  
      
    }  
     
    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:
     
     
    [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" />


  • 相关阅读:
    java内存回收机制
    scala学习
    [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
    linux 进程的创建
    linux中的进程和线程
    linux 文件系统
    gdb 调试程序
    makefile
    linux下的gcc编译器
    socket 网络编程
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318948.html
Copyright © 2020-2023  润新知