2012-07-20 3 views
1

Started Service을 시작한 활동에 대한 참조를 전달할 수 있다고 생각합니다. 서비스에는 Activity에 대한 참조가 있으므로 해당 참조의 메소드를 호출 할 수 있습니다.활동이 종료 된 후 시작된 서비스를 시작한 활동에 액세스

활동이 파괴되지만 서비스가 여전히 백그라운드에서 실행 중이면 서비스가 활동 참조 방법을 호출하면 어떻게됩니까?

답변

1

일반적으로 활동에 대한 참조를 저장하지 마십시오. 그렇다면 활동의 onDestroy()에서 해제해야합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다. 서비스에 참조를 저장하는 이유는 무엇입니까?

토스트 알림 또는 상태 표시 줄 알림을 사용하여 배경 작업이 완료되었음을 사용자에게 알릴 수 있습니다. 그것은 일반적인 관행입니다. Activity과 통신해야하는 경우 여러 가지 방법으로이를 수행 할 수 있습니다. Activity에 바인딩하거나 Intents을 사용하거나 AIDL을 사용할 수 있습니다. here 자세한 내용을 볼 수 있습니다.

ResultReceiver과 함께 Intents을 사용하는 옵션 중 하나를 설명합니다.

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

감사합니다. 예를 들어 "Job completed"메시지 또는 그와 비슷한 것으로 활동에 대한 알림을 보내고 싶습니다 ... 어떻게해야합니까? – giga

+0

나는 서비스와 활동 간의 의사 소통의 한 가지 방법을보기 위해 내 글을 편집했다. – biegleux

관련 문제