Начать с последних полученных байтов TrafficStats
Привет, я создаю приложение для Android, которое будет контролировать потребление данных пользователем, пока что все идет хорошо. Но я попал в ловушку, я хотел бы сохранить последние использованные данные, а затем, когда они снова запустят службу, начнется с последних использованных данных и так далее.
Это мой класс обслуживания:
//THIS METHOD IS CALLED EVERY 3 seconds to check for new DATA CONSUMED
public void displayNotificationWIFI() {
sharedPreferences = getSharedPreferences(SHARED_PREF_WIFI, Context.MODE_PRIVATE);
consumed = sharedPreferences.getString(WIFI_DATA_BYTES, null);
//CHECK IF CONSUMED IS NULL, IF NULL GET NEW DATA CONSUMED
if (consumed == null) {
rxBytes = TrafficStats.getTotalRxBytes() - mStartRX;
if (rxBytes >= 1024) {
rxKB = rxBytes / 1024;
received = String.format("%.0f", rxKB);
unit = "KB";
if (rxKB >= 1024) {
DecimalFormat formatMB = new DecimalFormat("0.0");
rxMB = rxKB / 1024;
received = formatMB.format(rxMB);
unit = "MB";
if (rxMB >= 1024) {
DecimalFormat formatGB = new DecimalFormat("0.0");
rxGB = rxMB / 1024;
received = formatGB.format(rxGB);
unit = "GB";
}
}
sharedPreferences = getSharedPreferences(SHARED_PREF_WIFI, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(WIFI_DATA_BYTES, String.valueOf(rxBytes));
editor.putString(WIFI_DATA, received + " " + unit);
editor.apply();
}
}
//SINCE NOT NULL, START FROM LAST DATA CONSUMED
else {
//STARTS FROM LAST DATA CONSUMED, BUT I THINK THIS IS WRONG?
rxBytes = (TrafficStats.getTotalRxBytes() - mStartRX) + Double.parseDouble(consumed);
if (rxBytes >= 1024) {
rxKB = rxBytes / 1024;
received = String.format("%.0f", rxKB);
unit = "KB";
if (rxKB >= 1024) {
DecimalFormat formatMB = new DecimalFormat("0.0");
rxMB = rxKB / 1024;
received = formatMB.format(rxMB);
unit = "MB";
if (rxMB >= 1024) {
DecimalFormat formatGB = new DecimalFormat("0.0");
rxGB = rxMB / 1024;
received = formatGB.format(rxGB);
unit = "GB";
}
}
//SAVING THE NEW LAST CONSUMED DATA
sharedPreferences = getSharedPreferences(SHARED_PREF_WIFI,Context.MODE_PRIVATE);
SharedPreferences.Editor editors = sharedPreferences.edit();
editors.putString(WIFI_DATA_BYTES, String.valueOf(rxBytes));
editors.apply();
}
}
remoteView = new RemoteViews(getPackageName(), R.layout.custom_notification_pingwifi);
remoteView.setTextViewText(R.id.txtData, received + " " + unit);
NotificationCompat.Builder n = new NotificationCompat.Builder(serviceClass.this);
n.setCustomContentView(remoteView)
.setSmallIcon(R.mipmap.ic_launcher)
.setOngoing(true);
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, n.build());
}
Проблема с моим кодом заключается в том, что при повторном запуске службы. Старые данные просто добавляются вместе с новыми данными, и они просто добавляются, добавляются и не останавливаются, даже если я не пользуюсь Интернетом.
1 ответ
Создайте глобальную переменную int в вашем сервисе, куда ваше приложение отправляет и получает данные. На самом деле отправка данных и получение данных все считаются использованием данных. поэтому каждый раз, когда вы получаете сообщение, подсчитываете его байт, а каждый раз, когда вы отправляете данные, подсчитываете его так:
totalBytes +=numberOfSent
tatalBytes +=numberOfReceived
в конце разделите его на 10^6, тогда вы получите использование данных в мегабайтах.
удачи!