【问题标题】:Android: Activity also calling other Service of the application, which is not calledAndroid:Activity也调用了应用的其他Service,没有被调用
【发布时间】:2013-02-16 13:19:31
【问题描述】:

我创建了一个基本上包含 2 个media players 的 android 应用程序。一种播放手机内存中的音乐,另一种播放来自互联网(URL)的流。

每个媒体播放器都在其单独的activity 中定义。我正在使用Service 进行播放。 (即当用户按下播放按钮时,服务会启动并播放媒体)。

MusicPlayer 是应用程序的默认活动,位于包com.example.musicplayer 中。而流播放器在不同的包中com.example.streamplayer

问题:当应用程序启动时,我选择流播放器并按下播放按钮,虽然 URL 流被播放,但我也注意到其他媒体播放器的 onStartCommand 即音乐玩家也会被跟注。

这意味着活动 B 正在调用服务 A,即使两者位于不同的包中。

音乐播放器活动和服务代码

package com.example.musicplayer;

public class MusicPlayerActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        ....
        Intent service = new Intent(this, MusicService.class);
        startService(service);
        ....
    }

}

package com.example.musicplayer;

public class MusicService extends Service {

    ....

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Toast.makeText(this, "Music Service onStartCommand()", Toast.LENGTH_LONG).show();       // This gets displayed even in the Stream Activty

        return START_STICKY;
    }
    ....

}

流活动和服务代码:

package com.example.streamplayer;

public class StreamPlayer extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ....
        Intent service = new Intent(this, StreamService.class);
        service.putExtra("URL", url);
        startService(service);
        ....
    }
}

package com.example.streamplayer;

public class StreamService extends Service {

    protected void startStream() {
        MediaPlayer mPlayer = new MediaPlayer();
        mPlayer.reset();
        mPlayer.setDataSource(url);
        mPlayer.prepareAsync();
        mPlayer.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();

            }
        });
    }
}

Manifest.xml

注意: 在清单文件中,我还尝试添加以指定哪个服务用于哪个意图。 (不确定它是否只这样工作)

<service
    android:name=".MusicService"
    android:enabled="true" >
    <intent-filter>
        <action android:name="com.example.musicplayer.MusicPlayerActivity" />
    </intent-filter>
</service>

<service
    android:name="com.example.streamplayer.StreamService"
    android:enabled="true" >
    <intent-filter>
        <action android:name="com.example.streamplayer.StreamService" />
    </intent-filter>
</service>

请建议如何确保不应该调用错误的服务?

这个问题的前传:here

谢谢

【问题讨论】:

    标签: android android-service android-mediaplayer


    【解决方案1】:

    您的清单仅显示一项服务,即使您定义了两项服务,并且您为定义的服务输入的操作没有意义(它与您在代码中定义的任何操作都不匹配)并且会是被忽略,因为您发送的两个 Intent 都是显式的。

    您的清单中是否同时定义了这两种服务?

    【讨论】:

    • 我已经定义了这两个服务...问题已更新。而且,你能告诉我们应该采取什么行动吗?我对这个元素有点困惑。谢谢
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多