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