2012-07-20 132 views
1

我想我可以傳遞一個啓動了Started Service的活動的引用。由於該服務具有該活動的參考,因此可以調用該參考的方法。訪問在活動被破壞後啓動已啓動服務的活動

現在,如果活動被破壞,但服務仍在後臺運行,如果服務調用活動引用的方法會發生什麼?

回答

1

你絕對應該避免存儲對一般活動的引用。如果是這樣,您必須在活動的onDestroy()中發佈它,否則可能會發生內存泄漏。您在服務中存儲參考的理由是什麼?

EDIT: 

您可以使用Toast通知或狀態欄通知,通知後臺工作已經完成了用戶。這是一種常見的做法。如果您需要與Activity溝通,有幾種方法可以實現它。您可以綁定到Activity,使用Intents或使用AIDL。你可以看到更多的細節here

我描述了使用Intents以及ResultReceiver的選項之一。

Service在應用程序的主線程中運行,所以如果你正在執行阻塞操作,你應該在服務中啓動一個新的線程。在這種情況下,您可以使用IntentService,它可以簡化您的工作並已實現線程化。

我會定製ServiceResultReceiverResultReceiver擴展。比我在我的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); 
     } 
    } 
} 
+0

謝謝您的回答。我想發送一些通知給活動,比如說「工作完成」的消息或類似的東西......我該如何實現它? – giga 2012-07-21 03:41:25

+0

我已經對我的帖子進行了編輯,以查看服務和活動之間的一種溝通方式。 – biegleux 2012-07-21 05:49:08

相關問題