如何在每 5 分钟服务后向活动发送更新的数据?



>我在活动中添加了一个服务类,我每 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;
}
};
}

请回复我,我将不胜感激每一个答案,提前谢谢

您可以在活动中注册自定义广播接收方,然后只需将广播从服务发布到活动即可。

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

下一个 在您的活动中添加广播接收器

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);
}
}
  • 最好的方法是将侦听器从活动设置为服务。
  • 另一种解决方案是使用广播接收器并将广播从服务发送到活动。

侦听器方法更好,因为您已经使用服务连接器,如果使用服务连接器,广播方法有点过度工程化。

最新更新