2012-09-25 1 views
0

내가이 개 활동이있는 라디오 내가 놀고있어 확인 :안드로이드

활동 A - 목록보기/어댑터를

활동 B - 활동가에서 라디오

, 나는 라디오와 B 연극을 선택 그 라디오 (서비스).

하지만 목록에서 다른 라디오를 선택할 때마다 활동 B가 다시 시작되고 라디오가 중지되고 다시 재생됩니다.

상황 예 :

# 1 - I'm playing Radio X, I choose X on the list 
# 2 - A new instance is created (service is in onCreate() of Activity B) 
# 3 - Radio X playing (play() is in onStart() of service) 
# 4 - I go back to the list 
# 5 - I want to play Radio Y 
# 6 - A new instance is created (service is in onCreate() of Activity B) 
# 7 - Radio Y playing (play() is in onStart() of service) 
# * In onCreate() of service isn't doing nothing 

모든 것은 괜찮지 만, 나는 목록에 돌아가서 동일한 무선을 선택하면 어떤 일이 예를 들어, 일 :

# 1 - Radio Y playing 
# 2 - I go back to the list 
# 3 - I wanna go to Radio Y again 
# 4 - A new instance is created (service is in onCreate() of Activity B) (I don't want this) 
# 5 - Radio Y stops and plays again (I don't want this) 
내가 가지고 싶은

라디오가 재생 중인지 확인하는 방법은 제가 가고 싶은 라디오입니다. 새 인스턴스를 만들지 않고 동일한 라디오를 다시 재생하지 마십시오.

편집 :

ListView에

if (item == "Radio 1"){ 
     Intent intent = new Intent(getBaseContext(), Radio.class); 
     intent.putExtra("radio", "http://test1.com"); 
     this.startActivity(intent); 
} else if (item == "Radio 2"){ 
     Intent intent = new Intent(getBaseContext(), Radio.class); 
     intent.putExtra("radio", "http://test2.com"); 
     this.startActivity(intent); 
} 

Radio.java

@Override 
public void onCreate(Bundle icicle) { 
    requestWindowFeature(Window.FEATURE_LEFT_ICON); 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    Intent music = new Intent(getApplicationContext(), Service.class); 
    music.putExtra("url", this.getIntent().getStringExtra("radio")); 
    startService(music); 
} 

Service.java

@Override 
public void onStart(Intent intent, int startid) { 
    Multiplayer m = new MultiPlayer(); 
    m.playAsync(intent.getExtras().getString("url")); 
} 

답변

0

내 대답은 조금 명확히하려면 :

다음과 같은 2 가지 옵션이 있습니다 (

재생중인 URL을 서비스 (onStart)에 저장하고 보내고있는 새 URL과 비교하십시오.

private String mCurrentUrl; 

@Override 
public void onStart(Intent intent, int startid) {  
    String newUrl = intent.getExtras().getString("url"); 

    if ((newUrl.equals(mCurrentUrl)) { 
     mCurrentUrl = newUrl; 
     Multiplayer m = new MultiPlayer(); 
     m.playAsync(mCurrentUrl); 
    } 
} 
또는

:

현재의 무선 채널을 검색하여 서비스 (AIDL)의 인터페이스를 정의한다. 액티비티를 바인딩 할 수있게하면이 메소드를 호출하여 현재 채널을 검색 할 수 있습니다. 참고 : startService를 사용하여 서비스를 시작한 다음 직접 바인딩해야합니다. (당신의 활동이 죽은 후에 다른 서비스가 죽임)

+0

고마워! 하지만이 코드가 어떻게 도움이 될지 아직 이해하지 못했습니다. 이 코드는 인스턴스가 이미 존재하는지 확인한 다음 새로운 스트리밍 링크가 동일한 스트리밍 링크의 서비스인지 확인한 다음, 그렇지 않은 경우 라디오를 중지하고 새 링크로 시작하는 것입니다. – Felipe

+0

나는 나의 질문을 편집했다, 나는 묶는 것을 사용하지 않았다, 그것은 간단한 서비스이었다. 이런 방식으로 항상 라디오의 새로운 인스턴스를 만들고 항상 라디오의 onCreate() 메소드에 들어가서 항상 onStart() 메소드를 입력합니다. 이 간단한 방법을 갖고 싶습니다 :/ – Felipe

+0

서비스가 이미 실행되고 있으면 다시 작성되지 않습니다. 따라서 서비스의 onStart에서 새 URL에 대한 현재 URL을 확인하면 아무 것도하지 않을 수 있습니다. – RvdK