programing

Android BroadcastReceiver 또는 간단한 콜백 방법?

goodcopy 2021. 1. 14. 23:15
반응형

Android BroadcastReceiver 또는 간단한 콜백 방법?


내 프로젝트에서 나는 BroadcastReceivers를 장기 실행 스레드의 콜백으로 사용하고 있습니다 (예 : 활동에 다운로드가 완료되었음을 알리고 활동이 Thread사용자에게 적절한 메시지를 표시 할 수 있도록 작업자로부터 일부 응답 데이터를 보냅니다 .). BroadcastReceivers 를 사용하려면 브로드 캐스트 리시버를 사용할 때마다 등록 및 등록 해제에주의해야하며, 다운로드, WebService 호출 등 더 다양한 작업에이 메서드를 사용할 때 특히 보낼 메시지를 관리해야합니다. ..). 또한 Broadcast의 의도를 통해 사용자 지정 개체를 보내려면 개체를 만들어야합니다 Parcelable.

이 방법과는 달리 내가 사용하는 방법보다 더 간단한 콜백 방법도 보았습니다. 콜백 메서드는 앱 메시징에서 BroadcastRecaiver와 같은 효과를 얻는 데 사용할 수있는 간단한 인터페이스 메서드 구현입니다. 이 접근법은 복잡한 객체를 반환하기 위해 Parcelable 구현이 필요하지 않으며 BroadcastReceiver.. 같은 키를 사용하지 않습니다 . 나쁜 부분은 콜백 메서드를 호출하기 전에 콜백 객체에서 null 값을 확인해야한다는 것입니다. 또한 오류없이 UI를 업데이트 할 수 있도록 UI 스레드에서 구현 된 코드를 실행하고 있는지 확인합니다.

좋아, 나는 당신이 내가 말하는 것을 이해하기를 바랍니다 :).

이제 질문은 콜백 메서드가 BroadcastReceiver단일 응용 프로그램 내부에서 사용될 때 접근 방식 보다 더 낫다고 생각합니까 (더 가볍고, 깨끗하고, 빠릅니다 ..) ? (I 안드로이드를 사용하지 않는 오전 주 Service배경 작업을 위해 .. 단지 AsyncTaskThreadS)

감사합니다!


이것은 매우 흥미로운 질문이며 동일한 문제에 직면했습니다. 제 생각에는 두 가지 메커니즘을 모두 사용할 수 있으며 올바른 사용 방법은 사용 사례에 따라 다릅니다. 결정하기 전에 고려해야 할 몇 가지 사항이 있습니다.

콜백 메커니즘을 사용하면 몇 가지 이점이 있지만 제한 사항도 있습니다.

찬성

  • 구현하는 것은 간단하고 간단합니다.
  • 서로 상호 작용하는 구성 요소 간의 형식 안전성을 얻습니다.
  • 임의의 개체를 반환 할 수 있습니다.
  • 단위 테스트에서 모의 ​​콜백 (예 : mockito 또는 이와 유사한 것을 통해 생성됨)을 주입하기 만하면되기 때문에 테스트를 단순화합니다.

콘트라

  • UI 조작을하려면 메인 스레드로 전환해야합니다.
  • 일대일 관계 만 가질 수 있습니다. 일대일 관계 (관찰자 패턴)는 추가 작업 없이는 실현할 수 없습니다. 이 경우 Android의 Observer/ Observable메커니즘을 선호합니다 .
  • 이미 언급했듯이 null콜백이 선택 사항 일 수있는 경우 콜백 함수를 호출하기 전에 항상 확인해야합니다 .
  • 구성 요소가 서로 다른 서비스 기능을 가진 일종의 서비스 API를 제공해야하고 일반적인 콜백 함수가 몇 개만있는 콜백 인터페이스를 원하지 않는 경우 각 서비스 기능에 대해 특수 콜백 인터페이스를 제공할지 여부를 결정해야합니다. 많은 콜백 함수가있는 단일 콜백 인터페이스를 제공합니다. 이후의 경우 API에 대한 서비스 호출에 사용되는 모든 콜백 클라이언트는 대부분의 메서드 본문이 비어 있지만 완전한 콜백 인터페이스를 구현해야합니다. 빈 본문이있는 스텁을 구현하고 콜백 클라이언트가 해당 스텁에서 상속하도록하면이 문제를 해결할 수 있지만 이미 다른 기본 클래스에서 상속 한 경우에는 불가능합니다. 어떤 종류의 동적 프록시 콜백을 사용할 수 있습니다.http://developer.android.com/reference/java/lang/reflect/Proxy.html ),하지만 정말 복잡 해져서 다른 메커니즘을 사용할 생각입니다.
  • 콜백 호출을위한 클라이언트는 서비스 호출자가 직접 액세스 할 수없는 경우 다양한 메소드 / 구성 요소를 통해 전파되어야합니다.

- BroadcastReceiver접근 에 관한 몇 가지 사항 :

찬성

  • 구성 요소간에 느슨한 결합이 이루어집니다.
  • 1 대 n 관계 (1 대 0 포함)를 가질 수 있습니다.
  • onReceive()메서드는 항상 주 스레드에서 실행됩니다.
  • 전체 응용 프로그램의 구성 요소에 알릴 수 있으므로 통신하는 구성 요소가 서로 "볼"필요가 없습니다.

콘트라

  • 이것은 매우 일반적인 접근 방식이므로에서 전송하는 데이터의 마샬링 및 마샬링 해제 Intent는 추가 오류 소스입니다.
  • Intent다른 앱과의 상관 관계를 제거하려면의 작업을 고유 하게 만들어야합니다 (예 : 패키지 이름 앞에 추가). 원래 목적은 애플리케이션간에 브로드 캐스트를 수행하는 것입니다.
  • - BroadcastReceiver등록 및 등록 취소 를 관리해야합니다 . 이 작업을보다 편안하게 수행하려면 등록해야하는 작업으로 Activity에 주석을 달고 s를 사용하여 Activity등록 및 등록 취소를 수행하는 기본 클래스를 구현하는 사용자 지정 주석을 구현할 수 있습니다 . 행동 양식.IntentFilteronResume()onPause()
  • 이미 말했듯이와 함께 전송되는 데이터 IntentParcelable인터페이스 를 구현해야 하지만, 또한 엄격한 크기 제한이 있으며 .NET Framework로 많은 양의 데이터를 전송하는 경우 성능 문제가 발생합니다 Intent. 이에 대한 논의는 http://code.google.com/p/android/issues/detail?id=5878참조 하십시오 . 따라서 예를 들어 이미지를 보내려면 저장소에 임시로 저장하고 Intent사용 후 저장소에서 이미지 를 삭제 하는 수신자로부터 이미지에 액세스하기 위해 해당 ID 또는 URL을 보내야 합니다. 이로 인해 수신자가 여러 명인 경우 추가 문제가 발생합니다 (저장소에서 이미지를 언제 제거해야하고 누가해야합니까?).
  • 이러한 종류의 알림 메커니즘을 과도하게 사용하면 애플리케이션의 제어 흐름이 숨겨 질 수 있으며 디버깅 할 때 Intent특정 오류를 유발 한 원인 또는이 알림 체인이 특정 지점에서 끊어진 이유를 이해하기 위해 s 시퀀스로 그래프를 그리는 결과를 얻게 됩니다.

제 생각에는 모바일 앱조차도 UI 레이어와 코어 레이어 (비즈니스 로직 등)의 2 개 이상의 레이어에 아키텍처 기반이 있어야합니다. 일반적으로 장기 실행 작업은 코어 레이어 내부의 자체 스레드 ( s 를 통해 AsyncTask또는 s를 HandlerThread사용하는 경우 MessageQueue)에서 실행되며이 작업이 완료되면 UI를 업데이트해야합니다. 일반적으로 콜백을 사용하면 구성 요소간에 긴밀한 결합이 이루어 지므로 계층 경계를 통한 통신이 아닌 계층 내에서만이 방법을 사용하는 것이 좋습니다. UI 레이어와 코어 레이어 사이의 메시지 브로드 캐스팅 BroadcastReceiver의 경우 UI 레이어를 로직 레이어에서 분리 할 수 있는- 접근 방식을 사용합니다.


나는 당신 BroadcastReceiver이 당신의 경우 에 사용함으로써 얻는 것을 보지 못합니다 . 콜백 또는 더 나은 Handlers방법이 될 것입니다. BroadcastReceiver가입자가 누군지 모를 때 좋습니다.


이미받은 다른 훌륭한 답변에 다른 옵션을 추가하겠습니다.

인 텐트를 수신하기 위해 브로드 캐스트 수신기를 만들 필요가 없습니다. Android 매니페스트 파일에서 인 텐트를 수신하는 모든 활동을 등록 할 수 있습니다.

<activity android:name=".MyActivity">
        <intent-filter >
              <action android:name="intent.you.want.to.receive" /> 
              <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>     
....
</activity>

그런 다음 onNewIntent(Intent)활동 메소드를 재정 의하여 수신하십시오.

Intent를 보내려면 Context.startActivity(Intent)메서드를 사용하십시오 . 대부분의 경우 FLAG_ACTIVITY_SINGLE_TOPIntent에 플래그 를 추가하여 이미 실행중인 활동의 새 인스턴스를 만들지 않을 것입니다.

EDIT: I just noticed you are running within a single application. Therefore, a simple callback is probably best. The solution above does work in a single app, but is more appropriate for different applications. I'll leave this here just in case it helps someone. Good luck!


Broadcastreceivers should be used If you need to send broadcasts across applications while Callbacks (or Handlers as suggested by Alex) are better to use in your situation.

If you want to use other than these two, consider using Observer (Interface included in android) and delegate.

For delegate please consider this SO post.


not sure what the goal is , but if you wish to keep the same idea of using intent and broadcastReceiver , and want better performance and security than normal broadcastReceivers , you can try out this demo , available in the android support library :

http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.html

if not , you can always use asyncTask , service , handlers , etc...

ReferenceURL : https://stackoverflow.com/questions/10575239/android-broadcastreceiver-or-simple-callback-method

반응형