활동에서 생성 된 브로드 캐스트 수신기를 언제 등록 / 등록 해제해야합니까?


79

활동의 onCreate 이벤트에서 사용자 지정 브로드 캐스트 수신기를 만들어야하고 분명히 활동의 onDestroy 이벤트에서 브로드 캐스트 수신기 등록을 취소해야합니다.

명확성을 위해 이것은 내가 사용하는 코드의 일부입니다.

public class AnActivity extends Activity {
    private ResponseReceiver receiver;

    public class ResponseReceiver extends BroadcastReceiver {
           public static final String ACTION_RESP =
              "mypackagename.intent.action.MESSAGE_PROCESSED";

           @Override
            public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
            }
    }   

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new ResponseReceiver();
        registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

활동에 대한 onPause / onResume 및 onStart / onStop 이벤트도 브로드 캐스트 수신기를 등록 및 등록 취소해야한다는 것을 읽었습니다.

나는 이것에 대한 모범 사례로 간주되는 것과 그 이유를 정말로 이해하고 싶습니다.


onDestroy()는 호출 될 때 더 이상 이벤트가 수신자에 의해 수신되지 않기 때문 입니다.
de_billa_

답변:


91

수신기 onStart()onStop().

활동이를 등록하는 유일한 이유는 BroadcastReceiver사용자에게 이벤트를 알리기 위해 현재 활동에서 어떤 방식 으로든 이벤트를 사용하는 것입니다. 경우 onStop()호출 된 후,이 Activity전경에 더 이상 없다, 따라서 사용자를 업데이트하지 못할.

백그라운드에서 브로드 캐스트 이벤트를 수신하려면 여기에 표시된 서비스 사용을 고려해야 합니다 .

Konstantin이 말했듯이, onDestroy()은 (는) 호출이 보장 Activity되지 않으며 , 가 더 이상 열리지 않을 때 오랫동안 방송을 계속 수신 할 수 있습니다.


3
onCreate 대신 onResume에 등록 할 것을 제안합니까? 활동이 생성 될 때 onResume이 항상 호출 되나요?
jamesc

9
onResume을 등록해야합니다. 예, onCreate 만 등록하는 경우 onResume ()은 항상 표시되는 활동에서 호출됩니다 (활동이 나타나기 전에 호출되는 마지막 메소드입니다 ( developer.android.com/reference/android/app/Activity.html ). () 및 onPause () 등록을 해제하면 다음에 활동이 포 그라운드로 전환 될 때 onCreate ()가 다시 호출되지 않고 수신자를 다시 등록하지 않습니다. 그리고 예, 즉, onCreate를 수행하지 마십시오. ().
SnowyTracks 2010 년

1
@SnowyTracks : onStart / onStop이 아닌 onResume / onPause에서 BroadcastReceiver 등록 호출을 수행하는 것이 바람직한 이유에 대해 설명해 주시겠습니까? 바운드 서비스에 대한 개발자 가이드 찾고, 내가 발견 . 이 섹션이 끝날 무렵 onResume / onPause가 아닌 onStart / onStop에서 서비스 바인딩 / 바인딩 해제를 수행하는 것이 좋습니다 (성능상의 이유로). 이것이 BroadcastReceivers에도 적용되는지 궁금합니다. 미리 감사드립니다.
Janus Varmarken 2014 년

1
@jvmk 동의, Android 문서는 onStart 및 onStop에서이 작업을 수행하라고 말합니다. 99 %의 경우 거의 차이가 없다고 생각합니다. 동작의 차이는 대화 활동 또는 부분 전경 활동이 사용됩니다. 하지만 내 답변을 Android 문서와 일치하도록 업데이트하겠습니다
SnowyTracks 2014

1
어제 두 번째 문단을 편집 하셨군요 ... 좀 더 일관된 답변을 위해 노력해 주셔서 감사합니다. 그러나 OP의 질문이었던 onResume / onPause 대신 onStart / onStop을 사용해야하는 이유를 설명하지 않습니다 . 대신 두 번째 단락의 설명은 onStart / onStop과 마찬가지로 onResume / onPause에 대해서도 동일하게 적용됩니다. onPause가 호출되면 활동이 더 이상 포 그라운드에 있지 않습니다. 따라서 우리는 귀하의 추천에 대한 "이유"가 없습니다.
LarsH

19

로가 onDestroy()사용된다 호출 할 guaranted되지 onPause()등록 해제. 브로드 캐스트 수신기의 수명주기 고려 : 활동이 포 그라운드에있을 때만 활성화해야합니까? 그런 다음 onResume()/onPause()


사용자가 앱을 다시 시작할 수 있고 업데이트 된 데이터가이 경우 표시되어야하기 때문에 활동이 백그라운드에 있더라도 여전히 활동의 콘텐츠를 업데이트해야하는 경우 어떻게해야합니까?
Usman Rana

9

Android 문서는 브로드 캐스트 수신기를 등록 / 등록 취소하는 단일 위치를 규정하지 않지만 가능성으로 / 및 / 를 모두 언급 합니다 .onStart()onStop()onResume()onPause()

이 결정을 내리는 가장 큰 요인은 수신자가 작업을 수행 할 수 있어야하는시기입니다. 등록 및 등록 취소시기가 결정됩니다.

  • 수신자가 활동에 초점이 맞춰진 경우에만 브로드 캐스트에 대해 뭔가를해야합니까? 그렇다면, 당신은에 등록을 취소 / 등록 할 수 있습니다 onPause()/ onReceive(). ( onStart()/ 와 같이 더 긴 수명을 사용할 수도 onStop()있지만 수신자가 onReceive()활동에 초점이 있는지 확인하는 동안 확인해야합니다 .)

  • 수신자가 포커스가 없더라도 (예 : 대화 상자가 표시 될 때) 표시 될 때 작업을 수행해야합니까? 그렇다면 onStart()/를 사용하십시오 onStop()(또는 더 긴 수명이지만 수신자 onReceive()는 활동이 표시되는지 여부를 확인해야합니다).

  • 수신자가 활동이 보이지 않아도 브로드 캐스트에 대해 알아야합니까? 예를 들어, 활동 표시 될 때 결과 상태를 반영 할 수 있도록 어떤 일이 발생했음을 기억해야 합니까? 그런 다음 onCreate()/ 를 사용 onDestroy()하여 등록 / 등록 취소해야합니다. (이러한 종류의 기능을 구현하는 다른 방법이 있습니다.)

당신이 등록 할 경우 onStart(), 또한 그들을 등록하지 않은 onResume()즉 중복 때문에, : onResume()없이 호출되지 않습니다onStart() . 먼저 는 호출 .

또한 onPause ()를 가능한 한 가볍게 유지 하는 것이 가장 좋습니다 .

onPause () 실행은 매우 간단하며 저장 작업을 수행 할 시간이 충분하지 않습니다. 이러한 이유로 onPause ()를 사용하여 응용 프로그램 또는 사용자 데이터를 저장하거나 네트워크 호출을하거나 데이터베이스 트랜잭션을 실행해서는 안됩니다. 이러한 작업은 방법이 완료되기 전에 완료되지 않을 수 있습니다. 대신 onStop () 중에 과부하가 걸리는 종료 작업을 수행해야합니다.

그것은 그 사실 onDestroy()되어 호출 할 보장 할 수 없습니다 시스템 메모리를 절약하기 위해 사용자의 프로세스를 종료합니다. 그러나 프로세스가 종료되면 프로세스는 어쨌든 브로드 캐스트를 수신하지 않습니다. 이 경우 방송 수신기를 등록 해제해야합니까?


제 질문에 대한 답변을 주셔서 감사합니다.하지만 답변이 혼란스럽고 엄격하게 정확하지 않습니다. If you register in onStart(), don't also register them in onPause(), because that would be redundant: onPause() is never called without onStart() being called first.특히 수락 된 답변이 완벽하게 정확할 때 비논리적이고 혼란 스럽다고 말씀하셨습니다 .
jamesc

@jamesc : 죄송합니다. onPause가 아닌 onResume을 의미했습니다. 당신 말이 맞아요. 좀 헷갈리네요. 지금 수정되었습니다. 받아 들여지는 답변에 대해서는 댓글을 달았습니다. 이 답변은 수락 된 사람이 제공하지 않는 중요하고 관련성있는 정보를 추가한다고 생각합니다.
LarsH

5

Android는 onStop()방법 을 생략하여 애플리케이션을 종료 할 수 있습니다 . 이 상황을 해결하는 가장 좋은 방법 BroadcastReceiveronResume()메서드에 등록하고 onPause().


1
나도이 일을하고있다. 에 있었다 문제 onStop()aswell
Vygintas B

0

onResume () 및 onPause () 메서드에서 브로드 캐스트를 등록 및 등록 취소해야합니다.

onStart ()에 등록하고 onStop ()에 등록 취소하면. 그 때 다음 문제가 발생합니다.

장치 화면이 잠금 상태이면 onStop ()이 호출되고 잠금을 해제하면 onStart ()가 호출되지 않습니다. 그래서 onResume () 및 onPause () 메서드에서 등록 및 등록 해제했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.