使用服务绑定从服务更新活动TextView

时间:2014-05-31 08:59:49

标签: android service android-activity textview

我有阅读GPS纬度和经度的服务。我想更新服务locationlistener的{​​{1}}。

中的活动

我怎样才能实现它?我一直在阅读Service Bound但看起来它只是用于调用服务中的方法的活动而不是服务调用Activity中的textView。绑定服务是不是可以实现呢?

2 个答案:

答案 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)。