使用服务绑定从服务更新Activity TextView [英] Updating Activity TextView from service using Service binding
问题描述
我有一项读取GPS纬度和经度的服务.我想从服务的locationlistener
的onLocationChanged
更新活动.
I have a service for reading GPS latitude and longitude. I would like to update the activity from the service's locationlistener
's onLocationChanged
.
如何实现?我一直在阅读服务绑定,但看起来像是仅用于活动调用服务中的方法,而不用于服务调用活动中的textView.绑定服务无法实现吗?
How can I achieve it? I have been reading on Service Bound but it looks like it is only for activity to invoke the methods in service but not service invoke textView in Activity. Is binding service is not possible to achieve it?
推荐答案
您应使用您的服务中的LocalBroadcastManager 类,将Intent发送回Activity.
You should use the LocalBroadcastManager class from within your Service to send an Intent back to the Activity.
例如,包含单个TextView
的Activity
可以像这样设置BroadcastReceiver
:
For Example, An Activity
containing a single TextView
can set up a BroadcastReceiver
like such:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = (TextView) findViewById(R.id.main_activity_text_view);
LocalBroadcastManager.getInstance(this).registerReceiver(
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
double latitude = intent.getDoubleExtra(LocationBroadcastService.EXTRA_LATITUDE, 0);
double longitude = intent.getDoubleExtra(LocationBroadcastService.EXTRA_LONGITUDE, 0);
textView.setText("Lat: " + latitude + ", Lng: " + longitude);
}
}, new IntentFilter(LocationBroadcastService.ACTION_LOCATION_BROADCAST)
);
}
@Override
protected void onResume() {
super.onResume();
startService(new Intent(this, LocationBroadcastService.class));
}
@Override
protected void onPause() {
super.onPause();
stopService(new Intent(this, LocationBroadcastService.class));
}
}
基本的Service
可以广播以下所有位置更改:
And a basic Service
can broadcast all location changes as follows:
public class LocationBroadcastService extends Service {
public static final String
ACTION_LOCATION_BROADCAST = LocationBroadcastService.class.getName() + "LocationBroadcast",
EXTRA_LATITUDE = "extra_latitude",
EXTRA_LONGITUDE = "extra_longitude";
private static final int
MIN_TIME = 2000,
MIN_DISTANCE = 1;
@Override
public void onCreate() {
super.onCreate();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
sendBroadcastMessage(locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE,
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
sendBroadcastMessage(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
);
}
private void sendBroadcastMessage(Location location) {
if (location != null) {
Intent intent = new Intent(ACTION_LOCATION_BROADCAST);
intent.putExtra(EXTRA_LATITUDE, location.getLatitude());
intent.putExtra(EXTRA_LONGITUDE, location.getLongitude());
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
这篇关于使用服务绑定从服务更新Activity TextView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!