Opret en netværksmonitor ved hjælp af Android's TrafficStats-klasse

For et par uger siden skrev jeg en tutorial om, hvordan du overvåger batteristaten fra din Android-applikation. I dette indlæg beskrev jeg en række grunde til, at du muligvis vedrører din ansøgning om batteriets helbred. Blandt de nævnte motiver var blot at skrive din app for at bruge enhedens begrænsede ressourcer på en ansvarlig måde.

Den samme logik kan anvendes til en telefons netværksudnyttelse, især når du overvejer at ikke alle smartphone-brugere har ubegrænset båndbreddeplaner. At gå over allokering af båndbredde kan blive dyre hurtigt. I visse applikationsscenarier kan det være et ekstremt værdifuldt funktionstilbud at give din bruger mulighed for at konfigurere den maksimale mængde båndbredde, som din app bruger i en given tidsramme.

Ved de første udgivelser af Android-operativsystemet var der ikke en standard måde at få på båndbreddemetrik. Fra Android 2.2 introducerede Google imidlertid TrafficStats-klassen til netop dette formål. Følgende tutorial er en hurtig introduktion til klassen. Resultatet er en simpel båndbreddemonitor, der viser de totale byte, der er sendt og modtaget på platformen fra det tidspunkt, appen blev startet. Føl dig fri med at følge trin for trin eller downloade hele projektet her og importere det direkte til Eclipse.

1. Opret et nyt Android-projekt i Eclipse. Husk at bruge TrafficStats-klassen, du skal målrette API'en til Android 2.2 (Froyo) eller nyere.

2. I mappen / res / layout opretter vi en main.xml-ressource. Til dette projekt bruger vi bare en række tekstvisninger i et lodret stablet lineært layout.

 main.xml 
 "1.0" encoding = "utf-8" ?> 
 "Http://schemas.android.com/apk/res/android" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: orientering = "lodret" > 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: textSize = "16sp" 
 android: textStyle = "fed" 
 android: tyngdekraft = "center" 
 android: paddingBottom = "20dip" 
 android: text = "Traffic Stats Demo" /> 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: textSize = "14sp" 
 android: textColor = "# 00ff00" 
 android: tyngdekraft = "center" 
 android: text = "Send bytes" /> 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: textSize = "14sp" 
 android: tyngdekraft = "center" 
 android: tekst = "0" 
 android: id = "@ + id / TX" /> 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: textSize = "14sp" 
 android: textColor = "# ff0000" 
 android: tyngdekraft = "center" 
 android: text = "Modtage byte" /> 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: textSize = "14sp" 
 android: tyngdekraft = "center" 
 android: tekst = "0" 
 android: id = "@ + id / RX" /> 

3. Med vores layout på plads kan vi gå videre til / src-mappen. Opret Main.java ved at udvide Aktivitetsklassen. Lad os også gå videre og erklære tre private klassevariabler.

 Main.java 
 pakke com.authorwjf; 
 import android.app.Aktivitet; 
 import android.app.AlertDialog; 
 import android.net.TrafficStats; 
 import android.os.Bundle; 
 import android.os.Handler; 
 import android.widget.TextView; 
 public class Main udvider aktivitet { 
 privat Handler mHandler = ny Handler (); 
 privat lang mStartRX = 0; 
 privat lang mStartTX = 0; 
 } 

4. Vi vil bruge overstyringen on create til at initialisere vores private variabler samt planlægge et tilbagekald på UI-tråden. Skriv en note af kontrollen for enum TrafficStats.UNSUPPORTED. Mens min erfaring med TrafficStats-klassen har været uden problemer, hedder det i den officielle Google-dokumentation, at nogle enheder muligvis ikke understøtter denne type rapportering, og når det er tilfældet returnerer opkaldet den nævnte værdi. Derfor er det en god ide at skrive din kode defensivt, som jeg har demonstreret her.

 Main.java 
 @Override 
 offentligt tomrum onCreate (Bundle gemtInstanceState) { 
 super .onCreate (gemtInstanceState); 
 setContentView (R.layout. main ); 
 mStartRX = TrafficStats. getTotalRxBytes (); 
 mStartTX = TrafficStats. getTotalTxBytes (); 
 if (mStartRX == TrafficStats. UNSUPPORTED || mStartTX == TrafficStats. UNSUPPORTED ) { 
 AlertDialog.Builder alarm = ny AlertDialog.Builder ( dette ); 
 alert.setTitle ("Uh Oh!"); 
 alert.setMessage ("Din enhed understøtter ikke overvågning af trafikstatistik."); 
 alert.show (); 
 } andet { 
 mHandler.postDelayed (mRunnable, 1000); 
 } 
 } 

5. Sidst, men ikke mindst, er vi nødt til at opdatere vores display og omplanlægge det kørbare.

 Main.java 
 privat final Runnable mRunnable = new Runnable () { 
 offentlig annullering () { 
 TextView RX = (TextView) findViewById (R.id. RX ); 
 TextView TX = (TextView) findViewById (R.id. TX ); 
 long rxBytes = TrafficStats. getTotalRxBytes () - mStartRX; 
 RX.setText (lang. ToString (rxBytes)); 
 long txBytes = TrafficStats. getTotalTxBytes () - mStartTX; 
 TX.setText (lang. ToString (txBytes)); 
 mHandler.postDelayed (mRunnable, 1000); 
 } 
 }; 

Eksemplet rapporterer ganske enkelt samlede byte ind og ud af enheden, men jeg opfordrer dig til at se nærmere på TrafficStats-klassen. Du finder klassen, der er i stand til at rapportere målingerne ved hjælp af pakker i stedet for bytes, og metoder til at skelne mellem mobil og Wi-Fi-netværk I / O.

Figur A

© Copyright 2021 | pepebotifarra.com