使用server发送广播给activity实现网络延迟功能

来源:互联网 发布:反稀释 加权平均 知乎 编辑:程序博客网 时间:2024/06/04 19:42

今天做了一个网络延迟的demo,特意来记录下:


 先上效果图:


界面没有美化,只注重功能实现:







1.清单文件:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="nowspeed.tdotapp.myapplication">    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />    <!-- 访问网络. 某些位置信息需要从网络服务器获取 -->    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service android:name=".Floatingwindow.FloatWindowService"/>        <service android:name=".NetspeedService"/>    </application></manifest>


2.Service:


package nowspeed.tdotapp.myapplication;import android.app.Service;import android.content.Intent;import android.net.TrafficStats;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.util.Log;import android.widget.Toast;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * @author:Jack Tony * @tips  :实时获取当前网速的service * @date  :2014-9-24 */public class NetspeedService extends Service {    private long total_data = TrafficStats.getTotalRxBytes();    private Handler mHandler;    //几秒刷新一次    private final int count = 3;    /**     * 定义线程周期性地获取网速     */    private Runnable mRunnable = new Runnable() {        @Override        public void run() {            //定时器            mHandler.postDelayed(mRunnable, count * 1000);            Message msg = mHandler.obtainMessage();            msg.what = 1;//            msg.arg1 = getNetSpeed();            msg.obj=Ping("www.baidu.com");            mHandler.sendMessage(msg);        }    };    private String speednow="";    private String subresult;    @Override    public void onCreate() {        super.onCreate();        mHandler = new Handler(){            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                if (msg.what == 1) {                    //float real_data = (float)msg.arg1;//                    if (msg.arg1 > 1024) {//                        speednow = msg.arg1 / 1024 + "kb/s";//                    } else {//                        speednow = msg.arg1 + "b/s";//                    }                    speednow=(String) msg.obj;                    Log.e("wen","NetspeedService:"+speednow);                }            }        };    }    /**     * 核心方法,得到当前网速     * @return     */    private int getNetSpeed() {        long traffic_data = TrafficStats.getTotalRxBytes() - total_data;        total_data = TrafficStats.getTotalRxBytes();        return (int)traffic_data /count ;    }    public String Ping(String str) {        String resault = "";        Process p;        try {            //ping -c 3 -w 100  中  ,-c 是指ping的次数 3是指ping 3次 ,-w 100  以秒为单位指定超时间隔,是指超时时间为100秒            p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + str);            int status = p.waitFor();            InputStream input = p.getInputStream();            BufferedReader in = new BufferedReader(new InputStreamReader(input));            StringBuffer buffer = new StringBuffer();            String line = "";            while ((line = in.readLine()) != null){                buffer.append(line);                Log.e("wen","line:"+line);            }            System.out.println("Return ============" + buffer.toString());            if (status == 0) {                resault = "success";                String   strs = buffer.toString();                String pattern = "time=.*?ms";                // 创建 Pattern 对象                Pattern r = Pattern.compile(pattern);                // 现在创建 matcher 对象                Matcher m = r.matcher(strs);                if (m.find( )) {                    resault = m.group();                    Log.e("wen","resault:"+resault);                    subresult = resault.substring(5,resault.length());                    //发送广播                    Intent intent=new Intent();                    //设置Action                    intent.setAction("aa");                    //携带数据                    intent.putExtra("time",subresult);                    //发送广播                    sendBroadcast(intent);                    Toast.makeText(getApplicationContext(), "发送广播成功"+subresult, Toast.LENGTH_SHORT).show();                }            } else {                resault = "faild";            }        } catch (IOException e) {            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        }        return resault;    }    /**     * 启动服务时就开始启动线程获取网速     */    @Override    public void onStart(Intent intent, int startId) {        mHandler.postDelayed(mRunnable, 0);    };    /**     * 在服务结束时删除消息队列     */    @Override    public void onDestroy() {        mHandler.removeCallbacks(mRunnable);        super.onDestroy();    }    @Override    public IBinder onBind(Intent intent) {        return null;    }}

3.Activity:


package nowspeed.tdotapp.myapplication;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private TextView tvshow ,tvtime;    private String time;    Handler handler=new Handler();    Runnable able=new Runnable() {        @Override        public void run() {            tvtime.setText(time);            handler.postDelayed(able,1000);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//        sp = getSharedPreferences("mytime",MODE_PRIVATE);        tvshow= (TextView) findViewById(R.id.tvshow);        tvtime= (TextView) findViewById(R.id.tvtime);        tvshow.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                startService(new Intent(MainActivity.this,NetspeedService.class));//                startService(new Intent(MainActivity.this, FloatWindowService.class));//                finish();                handler.postDelayed(able,1000);                           }        });    }    @Override    protected void onResume() {        super.onResume();        registerReceiver();    }    @Override    protected void onPause() {        super.onPause();        unregisterReceiver(mReceiver);    }    //注册广播    public void registerReceiver() {        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("aa");        registerReceiver(mReceiver, intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();    }    //接收广播    private BroadcastReceiver mReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            String action = intent.getAction();            if(action.equals("aa")){                String stringExtra = intent.getStringExtra("time");                tvtime.setText(stringExtra);            }        }    };}