我想我可以傳遞一個啓動了Started Service
的活動的引用。由於該服務具有該活動的參考,因此可以調用該參考的方法。訪問在活動被破壞後啓動已啓動服務的活動
現在,如果活動被破壞,但服務仍在後臺運行,如果服務調用活動引用的方法會發生什麼?
我想我可以傳遞一個啓動了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