2012-05-23 3 views
2

서비스에서 활동으로 메시지를 보내는 데 대한 수많은 게시물을 살펴 봤지만이 기능을 사용할 수 없습니다. 내 수신기가 절대 호출되지 않습니다. 액티비티가 포 그라운드에 있지 않은 경우 중요합니까?내 서비스에서 내 활동으로 내 브로드 캐스트를 수신하지 못했습니다.

내 시나리오는 다음과 같습니다. 웹 서버를 서비스로 실행하고 있습니다. 웹 서버가 재생 목록 링크가있는 URL을 수신하면 미디어 플레이어 역할을하는 활동에 메시지를 보내야합니다. 미디어 플레이어는 재생 목록을 읽고 노래, 비디오 등을 순서대로 재생합니다.

때때로 서비스가 빨리 감기 또는 일시 중지와 같은 명령을 보낼 수 있기 때문에 서비스가 미디어 플레이어 활동의 새로운 인스턴스를 시작하는 것을 원하지 않습니다.

public class HubPlayer extends Activity implements 
OnBufferingUpdateListener, OnCompletionListener, 
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback 
{ 
private IntentFilter intentFilter = new IntentFilter("com.jigawattlabs.hubplayer.play"); 

MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); 

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    setContentView(R.layout.mediaplayer_2); 

    registerReceiver(mReceiver , intentFilter); 

} 

public class MyBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     extras = intent.getExtras(); 

     sHost = extras.getString(ACTIVITY_PARAM_HOST); 
     sPort = extras.getString(ACTIVITY_PARAM_PORT); 
     sType = extras.getString(ACTIVITY_PARAM_TYPE); 
     sXMLURL = extras.getString(ACTIVITY_PARAM_URL); 

     DebugMsg("received broadcast in MyBroadcastReceiver."); 
     processInputRequest(); 
    } 
} 
} 

내가 브로드 캐스트 리시버 내에서 등록하고있어 이후 매니페스트에 넣고 필요하지 않는 것 비록 내 활동에서

private void sendMessage() { 


    Log.d("juice NonoHTTPD sender", "Sending message from Hub Web Server to Hub Player"); 

    Intent intent = new Intent(); 
    intent.putExtra(HubPlayer.ACTIVITY_PARAM_HOST, sAppHost); 
    intent.putExtra(HubPlayer.ACTIVITY_PARAM_PORT, sAppPort); 
    intent.putExtra(HubPlayer.ACTIVITY_PARAM_TYPE, sAppType); 
    intent.putExtra(HubPlayer.ACTIVITY_PARAM_URL, sAppPath);  
    intent.setAction("com.jigawattlabs.hubplayer.play"); 
    appContext.sendBroadcast(intent); 
} 

: 내 웹 서버 서비스에서

내 코드, 의도 필터를 추가했습니다.

<activity android:label="Media Hub Player" android:launchMode="singleTask" 
     android:screenOrientation="unspecified" 
     android:name=".HubPlayer" > 
     <intent-filter> 
      <action android:name="com.jigawattlabs.hubplayer.play" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter>    
    </activity> 

미리 감사드립니다.

+0

** 활동이 포 그라운드에없는 경우 중요합니까? ** 매우 그렇습니다. 'Activity'가 포어 그라운드에 있지 않지만 음악을 재생/제어해야하는 상황이 필요하다면'Service'에서'MediaPlayer'를 호스팅해야합니다. – Squonk

+0

logcat ("자세한 정보 필터링"사용)을보고 브로드 캐스트 인 텐트가 전송되는지 확인하십시오. 또한 권한 오류 또는 기타 오류가 있는지 확인하십시오. –

+0

음악 재생 만하면 MediaPlayer가 좋겠지 만 사진과 비디오도 보여줘야합니다. 그래서 UI 스레드에서 뭔가가 필요합니다. 내 자신의 디버그 문 이외의 logcat 아무것도 표시되지 않습니다. 메시지를 보내는 것이 이미 실행 중이 아니면 활동을 시작한다고 가정했으나 유효 가정이 아닐 수도 있습니다. –

답변

0

그래,이 문제를 해결할 수 있지만 더 나은 것을 기대하고 있습니다. 다음은 서비스 활동에 메시지를 보낼 필요가 있다면 내가

  • 을했던 것입니다, 그것이
  • 위와 같이 sendBroadcast를 수행, 활동이 실행중인 경우 활동이
  • 실행되고 있는지 확인 액티비티가 실행되지 않으면 StartActivity를 수행하고 sendBroadcast와 동일한 정보를 전달합니다.
  • 액티비티에서 인 텐트를 등록 된 BroadcastReceiver 나 onResume에 전달 된 인 텐트 중에서 선택합니다 (StartActivity가 라는). 여기

당신이 우리에게 receiever을해야, 당신은 항상 의도를 얻고 싶은 경우에 활동이

public boolean isHubRunning() 
{ 
    boolean isServiceFound = false; 

    ActivityManager activityManager = (ActivityManager)appContext.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isServiceFound = false; 
    for (int i = 0; i < services.size(); i++) 
    { 
     //DebugMsg(services.get(i).topActivity.toString()); 
     if (services.get(i).topActivity.toString().contains("juicemediahub.HubPlayer")) 
     { 
      isServiceFound = true; 
     } 
    } 
    DebugMsg("Hub Player Running = " + String.valueOf(isServiceFound)); 
    return isServiceFound; 
} 
0

실행되고 있는지 확인하는 코드입니다. 매니페스트에 정의하면 방송, 활동 실행 여부가 항상 캡처됩니다. 예 :

<receiver android:name=".StartOnUser"> 
    <intent-filter> 
     <action android:name="android.intent.action.USER_PRESENT" /> 
    <category android:name="android.intent.category.HOME" /> 
    </intent-filter> 
</receiver> 
관련 문제