Started Service
을 시작한 활동에 대한 참조를 전달할 수 있다고 생각합니다. 서비스에는 Activity에 대한 참조가 있으므로 해당 참조의 메소드를 호출 할 수 있습니다.활동이 종료 된 후 시작된 서비스를 시작한 활동에 액세스
활동이 파괴되지만 서비스가 여전히 백그라운드에서 실행 중이면 서비스가 활동 참조 방법을 호출하면 어떻게됩니까?
Started Service
을 시작한 활동에 대한 참조를 전달할 수 있다고 생각합니다. 서비스에는 Activity에 대한 참조가 있으므로 해당 참조의 메소드를 호출 할 수 있습니다.활동이 종료 된 후 시작된 서비스를 시작한 활동에 액세스
활동이 파괴되지만 서비스가 여전히 백그라운드에서 실행 중이면 서비스가 활동 참조 방법을 호출하면 어떻게됩니까?
일반적으로 활동에 대한 참조를 저장하지 마십시오. 그렇다면 활동의 onDestroy()
에서 해제해야합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다. 서비스에 참조를 저장하는 이유는 무엇입니까?
토스트 알림 또는 상태 표시 줄 알림을 사용하여 배경 작업이 완료되었음을 사용자에게 알릴 수 있습니다. 그것은 일반적인 관행입니다. Activity
과 통신해야하는 경우 여러 가지 방법으로이를 수행 할 수 있습니다. Activity
에 바인딩하거나 Intents
을 사용하거나 AIDL
을 사용할 수 있습니다. here 자세한 내용을 볼 수 있습니다.
ResultReceiver과 함께 Intents
을 사용하는 옵션 중 하나를 설명합니다.
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);
}
}
}
감사합니다. 예를 들어 "Job completed"메시지 또는 그와 비슷한 것으로 활동에 대한 알림을 보내고 싶습니다 ... 어떻게해야합니까? – giga
나는 서비스와 활동 간의 의사 소통의 한 가지 방법을보기 위해 내 글을 편집했다. – biegleux