ProgramingTip

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

bestdevel 2020. 10. 24. 11:21
반응형

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


활동의 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 이벤트도 브로드 캐스트하는 등록 및 등록 취소해야한다는 것을 읽었습니다.

나는 이것에 대한 모범 사례를보고 그 이유를 이해하고 싶습니다.


접수 onStart()onStop().

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

백그라운드에서 브로드 캐스트 캐스트 이벤트를 수신하고 여기에 서비스 사용을 적절 합니다 .

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


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


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

이 결정을 내리는 가장 큰 사건은 업무가 작업을 수행 할 수 있습니다. 등록 및 등록 취소시기가 결정됩니다.

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

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

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

onStart()등록하는 onResume()경우 중복되기 때문에에 등록하지 마십시오 . 먼저 onResume()호출되지 않고 onStart()는 호출 되지 않습니다 .

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

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

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


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


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

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

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

참고 URL : https://stackoverflow.com/questions/7887169/when-to-register-unregister-broadcast-receivers-created-in-an-activity

반응형