2012-05-23 65 views
2

我已經看了很多關於從服務發送消息到活動的帖子,但我無法得到它的工作。我的接收器永遠不會被調用。如果活動不在前臺,這有什麼關係?沒有收到從我的服務到我的活動廣播

這是我的場景 - 我正在運行Web服務器作爲服務。當網絡服務器收到一個鏈接到播放列表的URL時,我需要發送一條消息給我的作爲媒體播放器的活動。媒體播放器將讀取播放列表並開始播放歌曲,視頻等。

我不希望服務啓動媒體播放器活動的新實例,因爲它有時可能會發送類似快進或暫停的命令。

從我的Web服務器服務:

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); 
} 

從我的活動:

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(); 
    } 
} 
} 

即使它似乎並沒有必要把這個清單,因爲我註冊內的廣播接收器我的代碼,我還添加了一個意圖過濾器:

<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

**如果活動不在前臺?**這很重要嗎?很可能。如果您需要一種情況,即「活動」不在前臺,但您需要播放/控制音樂,則應將「MediaPlayer」託管在「服務」中。 – Squonk

+0

查看logcat(使用「詳細」過濾)並查看廣播意圖是否正在發送。另請參閱是否有任何權限錯誤或其他錯誤。 –

+0

如果我只需要播放音樂,MediaPlayer會很好,但我還需要顯示照片和視頻。所以我需要UI線程上的東西。除了我自己的調試語句外,我在logcat中看不到任何東西。我認爲發送消息會啓動活動,如果它尚未運行,但也許這不是一個有效的假設。 –

回答

0

好的,我有一個解決方法,但我希望有更好的東西。下面是我做的

  • 如果服務需要將消息發送到一個活動,它會檢查,看看是否活動運行
  • 如果該活動正在運行,它的sendBroadcast如上
  • 如果活動未運行,則執行StartActivity並將其傳遞給我與sendBroadcast相同的信息
  • 從活動中,我從註冊的BroadcastReceiver或onResume傳遞的意圖中獲取意圖(如果StartActivity是所謂的)。

下面是代碼檢查活動正在運行

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

如果你想始終獲得意圖,你應該我們receiever。在您的清單中定義它,它會始終捕獲您的廣播,活動是否運行。例如:

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