2012-07-18 1 views
1

의 서비스에서의 활동에 다시 데이터를 전달하기 위해, 나는 약 ResultReceiver, 방송/현지 방송바인더 제본 서비스을 알게되었습니다. 그러나 나는이 접근 방식에 대해 혼란스러워합니다. 우리가 간단히 활동적인 정적 공공 기능을 무언가를 전달하기 위해 호출한다면,이 접근 방식의 장단점은 무엇입니까?통과 데이터 다시 활동 서비스

public interface ListenerInterface { 

    void DataExchange(String data); 


} 
public class MainActivity extends Activity implements ListenerInterface{ 

    private static MainActivity instance; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     instance=this; 

     Intent i=new Intent(); 
     i.setClass(this, MyService.class); 
     startService(i); 
    } 

    public static MainActivity getInstance(){ 
     if(instance!=null) 
      return instance; 

     return null; 
    } 

    @Override 
public void DataExchange(String data) { 
    // TODO Auto-generated method stub 
    Log.d("sohail","data received="+data); 
} 

} 

과 IntentService :

public class MyService extends IntentService{ 

    MainActivity obj; 
    public MyService() { 
     super("MyService"); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 
     // TODO Auto-generated method stub 

     MainActivity.getInstance().DataExchange("Service Data"); 
    } 

} 
+1

다른 응용 프로그램 구성 요소에서 액세스하려는 "활동"에 공개/정적 메서드 또는 멤버 변수를 절대 생성하지 마십시오. 작동하지 않으며 작동 방법이 아닙니다. http://developer.android.com/guide/components/fundamentals.html을 읽어주십시오. '활동'은 '특수 사례'클래스이며 독립적이어야합니다. 'ResultReceiver'를 사용하여'Service'에 바인딩하거나'BroadcastReceiver'를 꼭 사용하십시오. 그러나 결코'Activity'의 public/static 멤버에 접근 할 수 있다고 가정하지 마십시오. – Squonk

+0

'private static MainActivity instance; 이것은 응용 프로그램에서 메모리 누출을 일으킬 것입니다. – waqaslam

+0

모두에게 감사드립니다. 위에서 언급 한 모든 접근법을 사용했지만 매우 유명한 VoIP 응용 프로그램 [linphone] (http : // www. linphone.org). 지금은 분명합니다. – SohailAziz

답변

2

단점 : 내가 활동을 말해봐

  • 당신의 접근 방식과 활동의 여러 인스턴스가있을 수 있습니다 얻을 것이다 마지막으로 만든 단지 하나 결과.
  • 결과가 표시 될 때 표시되거나 사용되지 않을 수도 있습니다.
  • 귀하의 서비스는 귀하의 UI (활동)에 직접 따라 다릅니다.

더 나은 방법은 액티비티에 일부 인터페이스 (예 : DataHandler)를 구현하고이를 서비스에 직접 연결하지 않는 것입니다. 또한 실제로 무언가를 할 수있을 때만 데이터를 수신하도록하려면 해당 액티비티를 처리기 onStart()으로 등록하고 onStop()의 등록을 취소하십시오.

+0

편집 된 질문을보십시오. 전문가가 아니야? – SohailAziz

+1

'getInstance()'액티비티는 간단히 작동하지 않습니다. 라이프 사이클은 플랫폼에 의해 관리되기 때문에 실행해야합니다. 그렇지 않으면 앱이 중단되고 레코딩됩니다. 왜 그렇게하는거야? –

+0

귀하의 빠른 답변을 주셔서 감사합니다 Elenkov, 나는 위에서 언급 한 모든 접근법을 사용하고 있었지만 매우 유명한 VoIP 응용 프로그램 [linphone] (http://www.linphone.org/eng/download/packages/)에서이 접근법을 알고 난 후에 혼란스러워했습니다. – SohailAziz