Как отправлять обновленные данные после каждых 5 минут обслуживания? - PullRequest
0 голосов
/ 12 февраля 2020

Я добавил класс обслуживания в свою деятельность. Я получаю обновленное местоположение из бэкэнда каждые 5 секунд, но я не знаю, как отправить обновленное местоположение в течение долгого времени от сервиса к действию. Вот мой класс обслуживания:

public class DriverLocationService extends Service   {
BackgroundService service;
private IBinder mBinder = new MyBinder();
private static String LOG_TAG = "BoundService";
String latDriver, longDriver;
public static String MY_ACTION = "MY_ACTION";

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

@Override
public void onRebind(Intent intent) {
    Log.v(LOG_TAG, "in onRebind");
    super.onRebind(intent);
}
@Override
public boolean onUnbind(Intent intent) {
    Log.v(LOG_TAG, "in onUnbind");
    return true;
}




@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (!service.isRunning()) {
        service.start();
        service.isRunning = true;

        if (intent != null && intent.getExtras() != null){

        }

    }
    return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
    super.onCreate();
    service = new BackgroundService();
    Log.d("CREATED>>>>", "Created");
}
@Override
public void onDestroy() {
    super.onDestroy();
    if (service.isRunning) {
        service.interrupt();
        service.isRunning = false;
        service = null;
    }
}
class BackgroundService extends Thread {
    public boolean isRunning = false;
    public long milliSecs = 5000;

    Runnable runTask = new Runnable() {
        @Override
        public void run() {
            isRunning = true;
            while (isRunning) {
                try {
                    Log.d("HANDLER_RUNNABLE>>>>", "HANDLER");
                    startTracking();
                    Thread.sleep(milliSecs);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    isRunning = false;
                }
            }
        }
    };

    public boolean isRunning() {
        return isRunning;
    }

    @Override
    public void run() {
        super.run();
        runTask.run();
    }

    public void startTracking(){
        ApiInterface apiInterface = RetrofitManager.getInstance().create(ApiInterface.class);
        Call<TrackResponse> call = apiInterface.checkTruckLocation(TruckApplication.ReadIntPreferences(SharedPrefData.PREF_BOOKING_ID) );
        call.enqueue(new Callback<TrackResponse>() {
            @Override
            public void onResponse(Call<TrackResponse> call, Response<TrackResponse> response) {
                if (response.isSuccessful()){

                    TrackResponse trackResponse  = response.body();
                    assert trackResponse != null;
                    if (trackResponse.getSuccess()) {

                        if (trackResponse.getMessage().equals("Tracking start")){
                            Toast.makeText(getApplicationContext(), trackResponse.getMessage(), Toast.LENGTH_SHORT).show();
                            latDriver =  trackResponse.getTruckLocation().getLat();
                            longDriver =  trackResponse.getTruckLocation().getLong();
                            Log.d("@@LAT2", latDriver);
                            Toast.makeText(getApplicationContext(), trackResponse.getTruckLocation().getLat(), Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(getApplicationContext(), trackResponse.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                        if (trackResponse.getMessage().equals("Tracking completed")){
                            Toast.makeText(getApplicationContext(), trackResponse.getMessage(), Toast.LENGTH_SHORT).show();
                             onDestroy();
                        }
                        else {
                            Toast.makeText(getApplicationContext(), trackResponse.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Toast.makeText(getApplicationContext(), trackResponse.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
                else {
                    Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show();
                }
            }
            @Override
            public void onFailure(Call<TrackResponse> call, Throwable t) {
                Log.e("Error", t.getLocalizedMessage());

            }
        });
    }

}

public String getLatLong() {

    double lat= Double.parseDouble(latDriver);
    double longD= Double.parseDouble(longDriver);
    return lat + ":" + longD ;
}

public class MyBinder extends Binder {
    public DriverLocationService getService() {
        return DriverLocationService.this;
    }
}

}

и вот моя деятельность, в которой я хочу обновить лат-лонг

  public class ShowDriverLocation extends AppCompatActivity {

DriverLocationService mBoundService;
boolean mServiceBound = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_driver_location);


    if (mServiceBound) {
        Toast.makeText(mBoundService, mBoundService.getLatLong(), Toast.LENGTH_SHORT).show();
    }
}
@Override
protected void onStart() {
    super.onStart();
    Intent intent = new Intent(this, DriverLocationService.class);
    startService(intent);
    bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
    super.onStop();
    if (mServiceBound) {
        unbindService(mServiceConnection);
        mServiceBound = false;
    }
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceDisconnected(ComponentName name) {
        mServiceBound = false;
    }
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
       DriverLocationService.MyBinder myBinder = (DriverLocationService.MyBinder) service;
        mBoundService = myBinder.getService();
        mServiceBound = true;
    }
  };
   }

пожалуйста, ответьте мне, я буду признателен за каждый ответ, спасибо заранее

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

в вашем DriverLocationService создайте функцию sendLocation (контекст, длинное местоположение)

private void sendLocation(Context context, long location) {
    Intent intent = new Intent("can.be.any.your.string.constant");
    intent.putExtra("your.location.data.identifier", location);
    context.sendBroadcast(intent);
}

далее в вашем действии добавьте BroadcastReceiver

private LocationReceiver receiver;
private IntentFilter filter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    receiver = new LocationReceiver();
    filter = new IntentFilter("can.be.any.your.string.constant");
}

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(receiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

private class LocationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //here the **location** will contain your data
        long location = intent.getLongExtra("your.location.data.identifier", 0);
    }
}
1 голос
/ 12 февраля 2020

Вы можете зарегистрировать пользовательский приемник широковещания в своей деятельности, а затем просто опубликовать sh трансляцию из своей службы в деятельность.

0 голосов
/ 12 февраля 2020
  • Наилучший подход состоит в том, чтобы настроить прослушиватель из активности в службу.
  • Другое решение состоит в том, чтобы использовать широковещательный приемник и отправлять широковещательные сообщения из службы в деятельность.

Метод прослушивания лучше, так как вы уже используете сервисный соединитель, широковещательный подход немного по сравнению с разработкой в ​​случае, если вы используете служебный соединитель.

...