رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

پست های پیشنهاد شده

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

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));

 

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

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

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

 

 

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 به اکتیویتی نیستید

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

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • مطالب مشابه

    • توسط hami develop
      سلام خدمت دوستان عزیز.
      من یک اپلیکیشن اندروید درست کردم و از کلاس service ارث بری کردم و هر دقیقه یک بار یک وب سایت را چک میکند و در صورتی که اطلاعات جدیدی در این وب سایت وجود داشته باشد به من یک نوتیفیکیشن میدهد.
      آیا بهتر است که از کلاس Worker ارث بری کنم تا برنامه وظایفی را انجام دهد؟
      نکته: در واقع می‌خواهم برنامه برای مدت طولانی اجرا شود و هیچ گاه متوقف نشود.
      اگر کسی از دوستان تجربه کار با Worker را دارد لطفا بفرمایند که اختلاف
      Worker 
      و
      Service 
      دقیقا چی هست و برای برنامه ای که همیشه در بک گراند در حال اجرا است، کدامیک بهتر است؟
      سپاس بی کران.
    • توسط AliAmani
      سلام.وقت بخیر.من به یه ارور بر خوردم. دیباگر attach نمیشه.لطفا راهنماییم کنید.
      اندروید استودیو را حذف و دوباره نصب کردم.avd جدید ایجاد کردم.adb را kill و بعد start کردم.اما درست نشد.
      مشکل فقط در پروژه های اندروید است و در پروژه های فلاتر مشکلی نیست.
      debug.pdf
    • توسط aliazmoodeh
      سلام من یه آپی دارم یه قسمت وجود داره که اطلاعات رو از سرور میگیره و تو ریسایکلرویو نمایش میده من میخوام این اطلاعات رو تو حالت افلاین هم داشته باشم یعنی چی یعنی بتونم اطلاعاتی که از سرور گرفتم قبلا رو وقتی کاربر اینترنت بهش نمایش بدم دقیقن مثله تلگرام میگم ولی نمیدونم باید چیکار کنم اگر اموزشی در این رابط دارید بهم بگید یا سورسی دارید بهم بگید پولی یا رایگان باشه برام فرقی نمیکنه فقط میخوام مشکلمو حل کنه
    • توسط Zeynab Tri
      سلام. دوستان بنده یک عدد تازه کار در برنامه نویسی اندروید هستم و نمیدونم این ارور رو چطور حل کنم. ممنون میشم اگر کسی میتونه من رو راهنمایی کنه.عکسش رو گذاشتم.

    • توسط moein123
      سلام دوستان خوبین؟
      من برای آپ خودم ثبتنام و لاگین دارم میسازم
      ثبتنام کاربر به خوبی کار میکنه و مشکلی نداره
      ولی برای لاگین کردن نمیدونم چرا کار نمیکنه
      پیغام خطا هم نمیده
      ببینین این کد سمت سروری که نوشتم
      <?php if($_SERVER['REQUEST_METHOD']=='POST'){ $mail2=$_POST['mail']; $password=$_POST['pass']; require_once 'connect.php'; $sql = "SELECT * FROM register WHERE mail='$mail2' "; $response=mysqli_query($conn,$sql); $result=array(); $result['login']=array(); if(mysqli_num_rows($response)===1){ $row=mysqli_fetch_assoc($response); if(password_verify($password,$row['pass'])){ $index['name']=$row['name']; $index['mail']=$row['mail']; array_push($result['login'],$index); $result['okk']='1'; $result['message']='okk'; echo json_encode($result); mysqli_close($conn); }else{ $result['okk']='0'; $result['message']='error'; echo json_encode($result); mysqli_close($conn); } } } ?> و اینم کد های جاوای اندروید که نوشتم
      package com.android.register1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.print.PageRange; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.google.android.material.snackbar.Snackbar; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class loginn extends AppCompatActivity { EditText edt_username,edt_password_login; Button btn_login; ProgressBar my_progcess; static String url_login="http://192.168.1.103/register2/login.php"; LinearLayout my_manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loginn); find_all(); } private void find_all() { edt_username=findViewById(R.id.edt_username); edt_password_login=findViewById(R.id.edt_pass_login); my_progcess=findViewById(R.id.my_progcess_login); btn_login=findViewById(R.id.btn_login); my_manager=findViewById(R.id.my_manager); btn_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String musername=edt_username.getText().toString().trim(); String mpassword=edt_password_login.getText().toString().trim(); if(!musername.isEmpty() || !mpassword.isEmpty()){ my_login(musername,mpassword); }else { edt_username.setError("username"); edt_password_login.setError("password"); } } }); } public void my_login(final String mail,final String pass){ my_progcess.setVisibility(View.VISIBLE); btn_login.setVisibility(View.GONE); StringRequest request=new StringRequest(Request.Method.POST, url_login, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject=new JSONObject(response); String message=jsonObject.getString("okk"); JSONArray jsonArray=jsonObject.getJSONArray("login"); if(message.equals("1")){ for (int i = 0; i <jsonArray.length() ; i++) { JSONObject jsonObject1=jsonArray.getJSONObject(i); String name=jsonObject1.getString("name").trim(); String mail=jsonObject1.getString("mail").trim(); Snackbar snackbar=Snackbar.make(my_manager, name+mail+"لاگین شدید",Snackbar.LENGTH_LONG); snackbar.getView().setTranslationY(-100); snackbar.show(); } } } catch (JSONException e) { e.printStackTrace(); Toast.makeText(loginn.this, "error1"+e.toString(), Toast.LENGTH_SHORT).show(); my_progcess.setVisibility(View.GONE); btn_login.setVisibility(View.VISIBLE); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(loginn.this, "error2"+error.toString(), Toast.LENGTH_SHORT).show(); my_progcess.setVisibility(View.GONE); btn_login.setVisibility(View.VISIBLE); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String>params=new HashMap<>(); params.put("mail",mail); params.put("pass",pass); return params; } }; RequestQueue requestQueue= Volley.newRequestQueue(this); requestQueue.add(request); } } ممنون میشم کمکم کنید 
  • فایل

×
×
  • اضافه کردن...