今天做了一个网络延迟的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); } } }; }