访问在活动被破坏后启动已启动服务的活动
问题描述:
我想我可以传递一个启动了Started Service
的活动的引用。由于该服务具有该活动的参考,因此可以调用该参考的方法。访问在活动被破坏后启动已启动服务的活动
现在,如果活动被破坏,但服务仍在后台运行,如果服务调用活动引用的方法会发生什么?
答
你绝对应该避免存储对一般活动的引用。如果是这样,您必须在活动的onDestroy()
中发布它,否则可能会发生内存泄漏。您在服务中存储参考的理由是什么?
EDIT:
您可以使用Toast通知或状态栏通知,通知后台工作已经完成了用户。这是一种常见的做法。如果您需要与Activity
沟通,有几种方法可以实现它。您可以绑定到Activity
,使用Intents
或使用AIDL
。你可以看到更多的细节here。
我描述了使用Intents
以及ResultReceiver的选项之一。
Service
在应用程序的主线程中运行,所以如果你正在执行阻塞操作,你应该在服务中启动一个新的线程。在这种情况下,您可以使用IntentService,它可以简化您的工作并已实现线程化。
我会定制ServiceResultReceiver
从ResultReceiver扩展。比我在我的Activity
中实现它的接口,并且在启动Service
时,我将接收器对象传递到IntentService
。
定制ResultReceiver
:
public class ServiceResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public ServiceResultReceiver(Handler handler) {
super(handler);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
你Activity
:
public class MyActivity extends Activity implements ServiceResultReceiver.Receiver {
private ServiceResultReceiver mReceiver;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mReceiver = new ServiceResultReceiver(new Handler());
mReceiver.setReceiver(this);
// starting a service
final Intent intent = new Intent(this, MyService.class);
intent.putExtra("receiver", mReceiver);
startService(intent);
}
...
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
// here you can handle data which came from your service.
Toast.makeText(this, "onReceiveResult()", Toast.LENGTH_SHORT).show();
}
你Service
:
public class MyService extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
// executing your task
...
// getting the receiver and sending back data in Bundle (here in this example we are sending no data)
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
if (receiver != null) {
receiver.send(0, null);
}
}
}
谢谢您的回答。我想发送一些通知给活动,比如说“工作完成”的消息或类似的东西......我该如何实现它? – giga 2012-07-21 03:41:25
我已经对我的帖子进行了编辑,以查看服务和活动之间的一种沟通方式。 – biegleux 2012-07-21 05:49:08