alexandre9009

مانیتور حجم دیتای ارسالی و دریافتی اینترنت

7 ارسال در این موضوع قرار دارد

سلام دوستان 
من یه پروژه درسی دارم باید تا فردا برای استاد بفرستم ، خیلی هم راجبش تحقیق کردم ، یک نرم افزار اندروید باید بنویسم که با زدن یک دکمه شروع به مانیتورینگ حجم دیتای ارسالی و دریافتی از اینترنت کنه  ، خب توی اینترنت سورس کد این بخش رو پیدا کردم 

MainActivity :

package com.authorwjf;

import android.app.Activity;
import android.app.AlertDialog;
import android.net.TrafficStats;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class Main extends Activity {
    
	private Handler mHandler = new Handler();
	private long mStartRX = 0;
	private long mStartTX = 0;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mStartRX = TrafficStats.getTotalRxBytes();
        mStartTX = TrafficStats.getTotalTxBytes();
        if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX == TrafficStats.UNSUPPORTED) {
        	AlertDialog.Builder alert = new AlertDialog.Builder(this);
			alert.setTitle("Uh Oh!");
			alert.setMessage("Your device does not support traffic stat monitoring.");
			alert.show();
        } else {
        	mHandler.postDelayed(mRunnable, 1000);
        }
    }
    
    private final Runnable mRunnable = new Runnable() {
        public void run() {
        	TextView RX = (TextView)findViewById(R.id.RX);
        	TextView TX = (TextView)findViewById(R.id.TX);
        	long rxBytes = TrafficStats.getTotalRxBytes()- mStartRX;
        	RX.setText(Long.toString(rxBytes/1048576));
        	long txBytes = TrafficStats.getTotalTxBytes()- mStartTX;
        	TX.setText(Long.toString(txBytes/1048576));
        	mHandler.postDelayed(mRunnable, 1000);
        }
     };
}

 

main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textStyle="bold"
        android:gravity="center"
        android:paddingBottom="20dip"
        android:text="Traffic Stats Demo" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="#00ff00"
        android:gravity="center"
        android:text="Transmit MB" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:gravity="center"
        android:text="0"
        android:id="@+id/TX"/>"
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="#ff0000"
        android:gravity="center"
        android:text="Receive MB" />
     <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:gravity="center"
        android:text="0"
        android:id="@+id/RX"/>
</LinearLayout>

 

خب این نرم افزار خوب کار میکنه و دیتای ارسالی و دریافتی کل شبکه رو مانیتور میکنه  ، اما یک مشکل داره وقتی برنامه رو میبندم و دوباره بازش میکنم کل مقادیر صفر میشه . 
تحقیق کردم و دیدم که باید از سرویس ها استفاده کنیم که بعد از بسته شدن نرم افزار هم بازم دیتا رو مانیتور کنه . 
این قسمتش رو نمیدونم که چجوری براش سرویس بنویسم ... 
ممنون میشم کمکم کنین ، و اینکه اگه سرویس نوشتیم چطور توی statusbar میتونیم با اینکه برنامه بسته هستش مقادیر رو مشاهده کنیم. خواهش میکنم راهنماییم کنین

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

این سرویس رو تست کنید

public class UpdaterServiceManager extends Service {

  private Handler mHandler = new Handler();
	private long mStartRX = 0;
	private long mStartTX = 0;
  
    public UpdaterServiceManager() {}

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // Code to execute when the service is first created
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
       
        mStartRX = TrafficStats.getTotalRxBytes();
        mStartTX = TrafficStats.getTotalTxBytes();
        if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX == TrafficStats.UNSUPPORTED) {
        	AlertDialog.Builder alert = new AlertDialog.Builder(this);
			alert.setTitle("Uh Oh!");
			alert.setMessage("Your device does not support traffic stat monitoring.");
			alert.show();
        } else {
        	mHandler.postDelayed(mRunnable, 1000);
        }
      
      
        return START_STICKY;
    }


 private final Runnable mRunnable = new Runnable() {
        public void run() {
        	TextView RX = (TextView)findViewById(R.id.RX);
        	TextView TX = (TextView)findViewById(R.id.TX);
        	long rxBytes = TrafficStats.getTotalRxBytes()- mStartRX;
        	RX.setText(Long.toString(rxBytes/1048576));
        	long txBytes = TrafficStats.getTotalTxBytes()- mStartTX;
        	TX.setText(Long.toString(txBytes/1048576));
        	mHandler.postDelayed(mRunnable, 1000);
        }
     };

 
}

تعریف سرویس در Manifest :

<service android:enabled="true" android:name="com.my.packagename.UpdaterServiceManager" />

 

اجرای سرویس در اکتیویتی :

Intent serviceIntent = new Intent(this, UpdaterServiceManager.class);
    startService(serviceIntent);

توقف سرویس در اکیتیویت :

    stopService(new Intent(getApplicationContext,UpdaterServiceManager.class));

 

1 کاربر پسند دیده است

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

ارسال شده در (ویرایش شده)

خب ممنونم ، از راهنماییتون ، من سرویس رو فعال کردم و به خوبی کار میکنه ، حالا سوال من اینجاست میخوام وقتی متغییری که حجم دانلود 

ان به یک مقدار مشخص رسید بیاد و وای فای رو خاموش یا روشن کنه . کد اش رو پیدا کردم هرکار میکنم کانتکس ارور میده 

 

 

package ir.alexandre9009.service;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.TrafficStats;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.widget.Toast;

public class FirstService extends Service{
    public static long mStartRX ;
    public static long mStartTX ;
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this,"FirstService Started!",Toast.LENGTH_LONG).show();
        mStartTX=0;
        mStartRX=0;
        mStartRX = TrafficStats.getTotalRxBytes();
        mStartTX = TrafficStats.getTotalTxBytes();
        if (mStartRX==5) {
            WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
            wifiManager.setWifiEnabled(false);

        }
        return START_STICKY;

}

    }

    @Override
    public void onDestroy() {
        TrafficStats.clearThreadStatsTag();
        Toast.makeText(this,"FirstService Stoped",Toast.LENGTH_LONG).show();
        mStartTX=0;
        mStartRX=0;
        super.onDestroy();
    }


}

 

Untitled.png

ویرایش شده در توسط alexandre9009
افزودن عکس ارور

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

 یک کانتکس اولش اضافه کردم ، ارورش رفت ولی یک ارور دگ میده 

    Context context;

 

 

کجای کد زیر اشتباه هستش ؟؟؟

 

package ir.alexandre9009.service;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.TrafficStats;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.widget.Toast;

public class FirstService extends Service{
    public static long mStartRX ;
    public static long mStartTX ;
    Context context;
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this,"FirstService Started!",Toast.LENGTH_LONG).show();
        mStartTX=0;
        mStartRX=0;
        mStartRX = TrafficStats.getTotalRxBytes();
        mStartTX = TrafficStats.getTotalTxBytes();
        if (mStartRX==5) {
            WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
            wifiManager.setWifiEnabled(false);

        }
        return START_STICKY;

}

    }

    @Override
    public void onDestroy() {
        TrafficStats.clearThreadStatsTag();
        Toast.makeText(this,"FirstService Stoped",Toast.LENGTH_LONG).show();
        mStartTX=0;
        mStartRX=0;
        super.onDestroy();
    }


}

 

Untitled 2.png

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

فک کنم باید درست باشه.

آیا به مشکلی خوردید ؟

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

نه کد ها همه درست هست ، سرویس به درستی کار میکنه . یک مشکل اساسی دگ : 

من یک مقدار رو بوسیله edittext در main activity. از کاربر میگیرم و برای سرویس ارسال میکنم . سرویس اون مقدار رو دریافت میکنه و در شرط if قرار میده و زمانی که داده ارسالی من به اون مقدار رسید اینترنت رو قطع میکنه . حالا اگر سرویس ران بشه و اکتیویتی سازنده اش destroy. بهش سرویس ریستارت میشه و مقدار null رو توی شرط if میزاره و برنامه کرش میکنه . راهی هست که سرویس پس از destroy  شدن برنامه ریستارت نشه ؟ 

من خیلی تحقیق کردم و گفتن باید  

return START_STICKY;

به 

 

return START_NOT_STICKY;

 

تبدیل کنم ، با این کار سرویس ریستارت نمیشه ولی انگار خود سرویس هم destroy  میشه چون هیچکاری نمیکنه . 

چکار باید بکنم ؟؟؟؟ بعضی ها گفتن از broadcast هم میشه بجای سرویس استفاده کرد و خیلی بهتره . میتونین کمکم کنین که broadcast بنویسم که حجم داده ارسالی و دریافتی رو مانیتور کنه و اگر به یک مقدار خاصی رسید بیاد و یک اکتیویتی رو ران کنه ؟ ( در بکگراند گوشی کار کنه و با بستن برنامه به کارش ادامه بده ) 

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بنظرم میتونید مقدار رو در sharedPrefrences ذخیره کنید و از سرور این مقدار رو بخونید و دیگه depend به اکتیویتی نیستید

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط cnankh
      سلام ، من هر پروژه ای که با اندروید استودیو ازش خروجی میگیرم ، فقط و فقط روی گوشی هایی که 7.1.1 هستن ران میشه ، درحالی ک موقع ساخت پروژه پایین ترین لول api هم انتخاب میکنم ، یعنی با هر نوع api که فکرشو کنین امتحان کردم اما بازم نتیجه نداد ، کسی میدونه مشکل کجاس؟
    • توسط hackn82
      سلام خدمت اساتید گرامی . 

      من یه برنامه نوشتن که برای یادگیری لغاته . وقتی کاربر لغتی رو به بخش علاقه مندی اضافه می کنه لغت نمایش داده نمیشه و باید برنامه رو مجدد اجرا کرد تا لغت انتخاب شده به بخش علاقه مندی اضافه/ حذف بشه . همچنین بعد از هر بار اجرا لیست لغات تکرار میشه ( مثلا بار دوم از هر کدوم 2 سری بار سوم از هرکدوم 3 سری و ... ) ایجاد میشه . ممنون میشم راهنماییم کنید . 
       
      package farmani.com.essentialwordsforielts.mainPage; import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.os.Environment; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import farmani.com.essentialwordsforielts.R; import farmani.com.essentialwordsforielts.search.ActivitySearch; public class MainActivity extends AppCompatActivity { public static Context context; public static ArrayList<Structure> list = new ArrayList<>(); public static ArrayList<Structure> favorite = new ArrayList<>(); DrawerLayout drawerLayout; NavigationView navigationView; ImageView hamburger; SQLiteDatabase database; String destPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.navigation_activity_main); if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE , Manifest.permission.WRITE_EXTERNAL_STORAGE} , 1); } else if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this , new String[]{Manifest.permission.READ_EXTERNAL_STORAGE , Manifest.permission.WRITE_EXTERNAL_STORAGE} , 1); } else { setupDB(); selectList(); selectFavorite(); Toast.makeText(MainActivity.this, "You grandet earlier", Toast.LENGTH_LONG).show(); } } if (!favorite.isEmpty()){ favorite.clear(); selectFavorite(); } else if (!list.isEmpty()){ list.clear(); selectList(); } context = getApplicationContext(); setTabOption(); drawerLayout = findViewById(R.id.navigation_drawer); navigationView = findViewById(R.id.navigation_view); hamburger = findViewById(R.id.hamburger); hamburger.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { drawerLayout.openDrawer(Gravity.START); } }); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); if (id == R.id.exit) { AlertDialog.Builder alertDialog = new AlertDialog.Builder( MainActivity.this); alertDialog.setTitle(R.string.exit); alertDialog.setMessage(R.string.exit_ask); alertDialog.setCancelable(false); alertDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); alertDialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } if (id == R.id.search) { Intent intent = new Intent(MainActivity.this, ActivitySearch.class); MainActivity.this.startActivity(intent); } return true; } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: { if (grantResults.length >= 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Access granted", Toast.LENGTH_LONG).show(); } } } } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(Gravity.START)) { drawerLayout.closeDrawer(Gravity.START); } else { AlertDialog.Builder alertDialog = new AlertDialog.Builder( MainActivity.this); alertDialog.setTitle(R.string.exit); alertDialog.setMessage(R.string.exit_ask); alertDialog.setCancelable(false); alertDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); alertDialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } } private void setTabOption() { ViewPager viewPager = findViewById(R.id.viewpager); viewPager.setAdapter(new AdapterFragment(getSupportFragmentManager(), context)); TabLayout tabStrip = findViewById(R.id.tabs); tabStrip.setupWithViewPager(viewPager); } private void setupDB() { try { destPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ielts/"; File file = new File(destPath); if (!file.exists()) { file.mkdirs(); file.createNewFile(); CopyDB(getBaseContext().getAssets().open("md_book.db"), new FileOutputStream(destPath + "/md_book.db")); } } catch (IOException e1) { e1.printStackTrace(); } } @Override protected void onResume() { super.onResume(); if (!favorite.isEmpty()){ favorite.clear(); selectFavorite(); } else if (!list.isEmpty()){ list.clear(); selectList(); } } private void CopyDB(InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close(); } private void selectFavorite() { database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db", null); Cursor cursor = database.rawQuery("SELECT * FROM main WHERE fav = 1", null); while (cursor.moveToNext()) { String word = cursor.getString(cursor.getColumnIndex("word")); String definition = cursor.getString(cursor.getColumnIndex("definition")); String trans = cursor.getString(cursor.getColumnIndex("trans")); String img = cursor.getString(cursor.getColumnIndex("img")); int id = cursor.getInt(cursor.getColumnIndex("id")); Structure struct = new Structure(word, definition, trans, img, id); struct.setWord(word); struct.setDefinition(definition); struct.setTrans(trans); struct.setImg(img); struct.setId(id); favorite.add(struct); } } private void selectList() { database = SQLiteDatabase.openOrCreateDatabase(destPath + "/md_book.db", null); Cursor cursor = database.rawQuery("SELECT * FROM main", null); while (cursor.moveToNext()) { String word = cursor.getString(cursor.getColumnIndex("word")); String definition = cursor.getString(cursor.getColumnIndex("definition")); String trans = cursor.getString(cursor.getColumnIndex("trans")); String img = cursor.getString(cursor.getColumnIndex("img")); int id = cursor.getInt(cursor.getColumnIndex("id")); Structure struct = new Structure(word, definition, trans, img, id); struct.setWord(word); struct.setDefinition(definition); struct.setTrans(trans); struct.setImg(img); struct.setId(id); list.add(struct); } } }  
    • توسط jonoob
      سلام وقت بخیر 
      من یک آپ میخواهم طراحی کنم که کاربر بتونه ساولش را بپرسه و کاربران جواب بدن و بتونن آن را لایک کنن .
      پنج قسمت داره
      مثلا = ریاضی - علوم - فارسی - قران-شیمی
      روی ریاضی کلیک کنه وارد اون بخش بشه تمام سوالات مطرح شده را ببینه بتونه روش کلیک کنه و جوابها را ببینه و بتونه لایک 
      و
      خودش بتونه سوال طرح کنه
       
       
      لطفا منو راهنمایی کنید
      ممنونم
    • توسط jonoob
      سلام به همه دوستان عزیز
      من می خواهم در یک صفحه اول برنامه این نمایش داده بشه 
      مثلا
      سلام صبح بخیر امروز سه شنبه 24 بهمن 1396
      اینهای که رنگی کردم بر اساس ساعت  و تاریخ به روز گوشی تغیر کند
      لطفا راهنمایی کنید
      مرسی از همگی دوستان
       
    • توسط evill
      سلام
      بنده در اکتیویتی دوم یدونه تب لایوت انداختم که چهارتا تب داره
      میخوام وقتی از اکتیویتی اول رفتم به اکتیویتی دوم ی تب خاص رو اول نشون بده
      مثلا تب دوم
      ولی همیشه تب اول از سمت چپ که اندیسش صفره رو اول نشون میده
      گفتن با این کد
      tableLayout.getTabAt(2); میشه ولی نشد ...راه دیگه ای هست دوستان؟

  • دوره آموزشی اندروید ایران کانادا آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin آموزش برنامه نویسی ios مهارت های فروش
    آموزش برنامه نویسی اندروید
  • فایل