我有阅读GPS纬度和经度的服务。我想更新服务locationlistener
的{{1}}。
我怎样才能实现它?我一直在阅读Service Bound但看起来它只是用于调用服务中的方法的活动而不是服务调用Activity中的textView。绑定服务是不是可以实现呢?
答案 0 :(得分:19)
您应该使用服务中的LocalBroadcastManager类将Intent发送回活动。
例如,包含单个Activity
的{{1}}可以设置TextView
,如下所示:
BroadcastReceiver
基本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
答案 1 :(得分:1)
什么阻止你宣布这样的方法(在你的服务中):
public void setTextViewToModify(TextView tv);
将TextView的引用提供给您的服务后,它可以像访问任何其他对象一样访问它。
另一方面,我不建议使用此解决方案,因为这种方式很容易导致内存泄漏。此外,TextView不应该离开Activity的上下文,因为它是Activity的一部分。即使在活动被销毁之后,该引用仍将保留在服务中,我想您可以想象如果服务触及死文本视图会发生什么。
您应该从您的服务广播更新,并使用LocalBroadcastRecever
在您的活动中获取这些更新。这样,TextView将由负责该活动的人更新。
如果您不喜欢LocalBroadcatReceiver
的概念,您可以尝试任何事件总线解决方案。它更容易使用,您可以传递任何类型的对象。您不必使它们成为可编组的(Serializable / Parcelable)。