2

我查看了许多关于从服务向活动发送消息的帖子,但我无法让它发挥作用。我的接收器永远不会被调用。如果 Activity 不在前台,这有关系吗?

这是我的场景 - 我将 Web 服务器作为服务运行。当网络服务器收到带有播放列表链接的 URL 时,我需要向充当媒体播放器的我的 Activity 发送一条消息。媒体播放器将读取播放列表并开始按顺序播放歌曲、视频等。

我不希望该服务启动媒体播放器活动的新实例,因为有时它可能会发送快进或暂停等命令。

从我的网络服务器服务:

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

尽管似乎没有必要将其放入清单中,因为我在代码中注册了 BroadcastReceiver,但我还添加了一个意图过滤器:

    <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> 

提前致谢。

4

2 回答 2

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; 
} 
于 2012-05-25T14:11:00.240 回答
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>
于 2013-11-17T07:26:20.807 回答