将参数传递给正在运行的服务线程

时间:2013-07-11 19:21:08

标签: android multithreading service parameters

我玩MP3播放服务有自己的类,使用Mediaplayer并连接HTTP。它必须播放在之前的Activity中选择的一个URL,我将其传递给PlayerActivity。

我在PlayerActivity onCreate

中以这种方式创建服务
         startService(new Intent(this, PlayerService.class));
         Intent connectionIntent = new Intent(this, PlayerService.class);
         bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE);

以下是首次选择的网址启动。我在新线程中启动Mediaplayer调用而不是阻止UI(调用本身在ActivityPlayer中):

private ServiceConnection mp3PlayerServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName arg0, IBinder binder) {
        mp3Service = ((LocalBinder) binder).getService();

        Thread t = new Thread() {
        public void run() {

            mp3Service.playSong(getApplicationContext(),url);

        }
        };

        t.start();


    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {

    }
 };

问题是如何将新URL传递给此Service的线程,当用户销毁此Activity时,转到菜单并选择新URL。新的流必须在同一个线程中播放,但我有回到Home的情况,带有后退按钮并再次启动app我同时播放了2个URL。可能是新Thread()声明的原因。

因此,当Activity使用URL创建时,如何将其URL直接传递给Service的线程,所以如果它是旧URL,则没有任何反应,如果是新的,则播放器切换到新URL,但不播放2一起流?

1 个答案:

答案 0 :(得分:0)

有什么理由不通过广播进行交流?您可以在服务中实现嵌套的BroadcastReceiver(如果需要,可以在活动中),只需从活动中向其发送信号即可。

如果有任何私人数据,您可以使用LocalBroadcastManager使其无法在系统范围内使用。

编辑:

对于其他用途,还有Android界面定义语言。