[Android] Intent보다 Service에서 UI를 업데이트하는 효율적인 방법은 무엇입니까?


Answers

LocalBroadcastManager를 사용 하면 브로드 캐스트 인 텐트를 시스템 전체가 아닌 자신의 응용 프로그램으로 보낼 수 있습니다.

Intent의 브로드 캐스트를 등록하고 프로세스 내의 로컬 객체에 전송하는 도우미. 이것은 sendBroadcast (Intent)로 글로벌 방송을 보내는 것보다 여러 가지 장점이 있습니다.

방송중인 데이터가 앱을 떠나지 않으므로 개인 정보 누설에 대해 걱정할 필요가 없습니다.

다른 응용 프로그램에서 이러한 브로드 캐스트를 앱으로 보낼 수 없으므로 악용 할 수있는 보안 허점에 대해 걱정할 필요가 없습니다.

시스템을 통해 글로벌 방송을 보내는 것보다 효율적입니다.

그러나 나는 여전히 서비스 접근법을 사용하고 효율적으로 UI 구성 요소를 업데이트해야 할 경우 Handler를 통해 로컬 바인딩 및 대화를하는 것이 좋습니다.

Question

나는 현재 안드로이드에서 샘플 VOIP 클라이언트 인 서비스를 가지고있어서 SIP 메시지를 청취하고 수신하면 UI 구성 요소가있는 활동 화면을 시작합니다.

그런 다음 다음 SIP 메시지가 Activity가 화면에 표시 할 내용을 결정합니다. 예를 들어 수신 전화가 응답 또는 거부 또는 발신 전화를 표시하면 전화 걸기 화면이 표시됩니다.

그 순간에 Intent를 사용하여 Activity가 표시해야하는 상태를 알 수 있습니다.

예를 들면 다음과 같습니다.

        Intent i = new Intent();
        i.setAction(SIPEngine.SIP_TRYING_INTENT);
        i.putExtra("com.net.INCOMING", true);
        sendBroadcast(i);

        Intent x = new Intent();
        x.setAction(CallManager.SIP_INCOMING_CALL_INTENT);
        sendBroadcast(x);
        Log.d("INTENT SENT", "INTENT SENT INCOMING CALL AFTER PROCESSINVITE");

따라서 활동에는 이러한 의도에 대해 등록 된 브로드 캐스트 수신자가 있으며 최종 수신 의도에 따라 상태가 전환됩니다.

샘플 코드는 다음과 같습니다.

       SipCallListener = new BroadcastReceiver(){

            @Override
            public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction(); 

                    if(SIPEngine.SIP_RINGING_INTENT.equals(action)){
                        Log.d("cda ", "Got RINGING action SIPENGINE");
                        ringingSetup();
                    }         

                    if(CallManager.SIP_INCOMING_CALL_INTENT.equals(action)){
                        Log.d("cda ", "Got PHONE RINGING action");
                        incomingCallSetup();
                    }  
            }
        };
        IntentFilter filter = new IntentFilter(CallManager.SIP_INCOMING_CALL_INTENT);
        filter.addAction(CallManager.SIP_RINGING_CALL_INTENT);
        registerReceiver(SipCallListener, filter);

그러나 이것은 효과적이지는 않지만 인 텐트는 방송 시스템을 넓히고 다른 주에서 발사해야하는 인 텐트는 비효율적 인 것처럼 보입니다. 복잡성을 더하고 포함시켜야합니다.

그래서 이렇게 더 효율적이고 깨끗한 다른 방법이 있는지 궁금합니다.

Intents 방송을 응용 프로그램 내에서만 유지할 수있는 방법이 있습니까?

콜백이 더 좋은 아이디어일까요? 그렇다면 왜 그리고 어떻게해야 구현됩니까?