Android服务可播放音乐,并在暂停和停止时停止

Android服务可播放音乐,并在暂停和停止时停止,android,service,media-player,android-mediaplayer,Android,Service,Media Player,Android Mediaplayer,我正在我的应用程序中实现MediaPlayer类,我希望在后台播放音乐,所以我使用了服务,而不是活动或广播接收器。现在的问题是,如果用户存在或暂停应用程序,音乐就会不停地播放。我确实添加了onStop和onPause方法,但问题仍然存在。我不能像在活动类中那样调用super.onPause()方法 经过一些研究,我发现即使应用程序暂停或停止,服务也会保持活动状态(我不知道这是真的),但根据我的经验,我认为这是真的。我该怎么办?我在谷歌和stackoverflow上搜索答案,但没有找到答案 这是一

我正在我的应用程序中实现MediaPlayer类,我希望在后台播放音乐,所以我使用了服务,而不是活动或广播接收器。现在的问题是,如果用户存在或暂停应用程序,音乐就会不停地播放。我确实添加了onStop和onPause方法,但问题仍然存在。我不能像在活动类中那样调用super.onPause()方法

经过一些研究,我发现即使应用程序暂停或停止,服务也会保持活动状态(我不知道这是真的),但根据我的经验,我认为这是真的。我该怎么办?我在谷歌和stackoverflow上搜索答案,但没有找到答案

这是一个代码

 package in.isuru.animation;

 import android.app.Service;
 import android.content.Intent;
 import android.media.MediaPlayer;
 import android.os.IBinder;
 import android.util.Log;

 public class PlayMusic extends Service{

private static final String TAG = null;
MediaPlayer player;

public void onCreate(){
    super.onCreate();
    Log.d(TAG, "Music service started onCreate()");
    player = MediaPlayer.create(this, R.raw.oh_holy_night);
    player.setLooping(true);
    //player.setVolume(100, 100);
}

public int onStartCommand(Intent intent, int flags, int startId){
    player.start();
    Log.d(TAG, "Player started!");
    if(player.isLooping() != true){
        Log.d(TAG, "Player not playing any file.");
    }
    return 1;
}

public void onStart(Intent intent, int startId){

}

public IBinder onUnBinder(Intent arg0){
    return null;
}

public void onStop(){
    player.stop();
    player.release();
}

public void onPause(){

    player.stop();
    player.release();

}

public void onDestroy(){
    player.stop();
    player.release();
    Log.d(TAG, "Player destroyed");
}

public void onLowMemory(){
    player.release();
}

@Override
public IBinder onBind(Intent arg0) {

    return null;
}

}

首先,你永远无法选择在广播接收器中长时间运行的任何事情,因为系统不会喜欢你。 所以我有点困惑。您希望音乐在后台播放,因此使用了服务。这是正确的。 但是现在你说当用户退出或暂停你的活动时,音乐仍在播放?是的,它会的,这不是你把它放在服务中的原因吗

你有两个选择。您可以在活动的onStart()/onResume()和onPause()/onStop()中移动启动和停止媒体播放器的调用。只有在活动具有前景时才会播放音乐


您的第二个选择是保持媒体在服务中播放。但是,您需要向您的服务发送意图,让它知道何时停止播放音乐。最好的方法是打包一个挂起的内容,交给通知管理器,通知管理器将启动一个活动,该活动上有暂停和播放音乐的按钮。如果您没有为用户提供返回到控制服务的活动的方法,那么您的音乐将播放到终端,用户将无法很好地将其关闭。

问题在于通信。 您在
onStartCommand()
中使用了
player.start()
,因此服务可以开始播放


停止/暂停音乐从未与服务沟通过,因此出现了问题。

好吧,我的主要活动是一个动画,如果我在该活动中播放音乐,它会与UI线程一起工作吗?几乎可以。默认情况下,服务也在UI线程上运行。服务本身不会卸载到它自己的线程。由于您正在进行CPU密集型MP3播放,因此必须创建一个新线程来启动此服务。这个新类必须接受一个上下文,以便它也可以启动和控制活动。我建议让您的活动实现可运行(而不是扩展线程)。这将允许您更灵活地重用变量。好的,谢谢。我将使用活动而不是服务。谢谢你的解释!如果您希望媒体播放器具有与活动相同的生命周期,那么您只希望使用活动而不是服务。(即,仅当活动出现在屏幕上时才播放)。我所说的活动(或者是子类)是实现runnable,而不是扩展线程。我强烈建议您在自己的线程中启动的服务中使用媒体播放器。希望这能把事情弄清楚。@FrankSposaroMSFT如果我想让
服务在我最小化应用程序或销毁它时停止,而不是在我切换到另一个
活动时停止,该怎么办?我希望音乐能在我的应用程序中播放。