ارسال لوکیشن با استفاده از Service ها دراندروید
سلام به تمامی برنامه نویسان اندروید؛
من میخوام یک برنامه ردیابی برای اندروید بنویسم که اگه کاربر از برنامه بیرون اومد همچنان اطلاعات مکانیو دریافت کنه و داخل بانک ذخیره کنه.
کد هایی که نوشتم
داخل کلاس MainActivity
public class MainActivity extends AppCompatActivity implements LocationListener { Intent IntentMyIntentService; @Override protected void onCreate(Bundle savedInstanceState) { IntentMyIntentService=new Intent(MainActivity.this, MyLocationService.class); startService(IntentMyIntentService); }
یک دکمه گذاشتم و گفتم زمانی که بر روی دکمه کلیک شد، سرویس مورد نظر از داخل Intent اجرا شود وداخل کلاس سرویس هم کد های زیر نوشتم:
public class MyLocationService extends Service { private static final String TAG = "MyLocationService"; private LocationManager mLocationManager = null; private static final int LOCATION_INTERVAL = 1000; private static final float LOCATION_DISTANCE = 1f; private ThreadGroup threadGroup = new ThreadGroup("ServiceThreadGroup"); String lat; String longi; private class LocationListener implements android.location.LocationListener, Runnable { Location mLastLocation; public LocationListener(String provider) { Log.e(TAG, "LocationListener " + provider); mLastLocation = new Location(provider); lat = "" + mLastLocation.getLatitude(); longi = "" + mLastLocation.getLongitude(); } public LocationListener(int counter, int startId) { } @Override public void onLocationChanged(Location location) { Log.e(TAG, "onLocationChanged: " + location); mLastLocation.set(location); if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } mLocationManager.requestLocationUpdates( LocationManager.PASSIVE_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, mLocationListeners[0]); lat=""+mLastLocation.getLatitude(); longi=""+mLastLocation.getLongitude(); } @Override public void onProviderDisabled(String provider) { Log.e(TAG, "onProviderDisabled: " + provider); } @Override public void onProviderEnabled(String provider) { Log.e(TAG, "onProviderEnabled: " + provider); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.e(TAG, "onStatusChanged: " + provider); } @Override public void run() { try { while (true) { Log.e(TAG, "Run is run "); Log.e(TAG,"lat is : "+lat); Log.e(TAG,"long is : "+longi); Thread.sleep(3000); } } catch (InterruptedException e) { Log.e(TAG, "Run is run "); } } } LocationListener[] mLocationListeners = new LocationListener[]{ new LocationListener(LocationManager.PASSIVE_PROVIDER) }; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand"); super.onStartCommand(intent, flags, startId); int counter = intent.getIntExtra("Counter", 0); new Thread(threadGroup, new LocationListener(counter, startId), "ServiceThread").start(); return START_STICKY; } @Override public void onCreate() { Log.e(TAG, "onCreate"); initializeLocationManager(); try { mLocationManager.requestLocationUpdates( LocationManager.PASSIVE_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, mLocationListeners[0] ); } catch (java.lang.SecurityException ex) { Log.i(TAG, "fail to request location update, ignore", ex); } catch (IllegalArgumentException ex) { Log.d(TAG, "network provider does not exist, " + ex.getMessage()); } } @Override public void onDestroy() { Log.e(TAG, "onDestroy"); super.onDestroy(); } private void initializeLocationManager() { Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: "+ LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE); if (mLocationManager == null) { mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); } } }
همه چیز کار میکنه و عالیه، زمانی که از برنامه بیرون میام یا به اصطلاح ondestroy() میزنم یا همون دکمه Home برنامه میزنم، برنامه stop نمیشه و به کار خودش ادامه میده، خب تا اینجا ظاهرا همه چیز خوبه! اما وقتی لوکیشن برنامه عوض میشه، اطلاعات نمایشی برای طول و عرض جغرافیایی تغییر نمیکنه! انگار دستورات داخل متد run فقط اجرا میشوند، ولی من میخوام onLocationChanged هم اجرا بشه و تغییر کنه.
اگ میشه راهنماییم کنین، ممنون.