我正在开发一款应用,我正在使用一种服务来播放背景音乐。 音乐只能在应用程序使用时播放,意味着在前台播放。 当我使用主页按钮或后退按钮离开应用程序时,音乐将停止(应用可能会保留在后台,但不可见 - >没有音乐)。 当我重新进入应用程序(使用主页按钮并切换回应用程序)时,音乐也将恢复。
我的服务:
public class MusicService extends Service {
MediaPlayer myPlayer;
private final IBinder localBinder = new LocalBinder();
public class LocalBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
public boolean onUnbind(Intent intent) {
return true;
// called when the last Activity is unbound from this service
// stop your timed operations here
}
@Override
public void onCreate() {
Toast.makeText(this, "Music Service Created", Toast.LENGTH_LONG).show();
myPlayer = MediaPlayer.create(this, R.raw.ost);
myPlayer.setLooping(true); // Set looping
}
@Override
public void onDestroy() {
Toast.makeText(this, "Music Service Stopped", Toast.LENGTH_LONG).show();
myPlayer.stop();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Music Service Started", Toast.LENGTH_LONG).show();
if(!myPlayer.isPlaying())
myPlayer.start();
}
}
我还为所有活动使用父类。在那个父类中,我想在Methods onPause()和onStop()上停止服务:
ComponentName topActivity = taskInfo.get(0).topActivity;
if(!topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {
stopService(new Intent(this, MusicService.class));
我在启动器活动
上启动服务startService(new Intent(this, MusicService.class));
Intent intent = new Intent(this, MusicService.class);
bindService(intent, this, 0);
现在我的问题:当我按下主页按钮时服务不会停止,当我离开应用程序时,服务不会停止(后退按钮)。 当我终止应用程序的任务时,服务会在几秒钟后重新启动,音乐将一直运行,直到我强制设置应用程序停止服务或卸载应用程序。
那么当应用程序处于不可见的背景或关闭时,如何完全关闭服务?我已经通过这里的几个主题,youtube视频,教程和尝试了很多。我也试过非服务解决方案,但我无法解决问题。
谢谢!
答案 0 :(得分:0)
此处实现此功能的替代方法,但使用服务实现是标准方式
创建一个类ApplicationContextHolder,如下所示
public class ApplicationContextHolder extends Application {
public static ApplicationContextHolder instance;
public MediaPlayer mediaPlayerHome = new MediaPlayer();
public static ApplicationContextHolder getAppInstance() {
return instance;
}
public ApplicationContextHolder() {
instance = this;
}
public void saveLastPlayingSongPath(String filePath) {
songHolder = this.getSharedPreferences("songPath", 0);
Editor editor = songHolder.edit();
editor.putString("path", filePath);
editor.commit();
}
public MediaPlayer getMediaPlayerForHome(Context ctx, int id) {
return mediaPlayerHome = MediaPlayer.create(ctx, id);
}
public void stopMediaPlayerHome()
{
if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) {
mediaPlayerHome.stop();
mediaPlayerHome.reset();
}
}
public void pauseMediaPlayerHome() {
if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) {
mediaPlayerHome.pause();
}
}
public void startMediaPlayerHome() {
if (mediaPlayerHome != null)
mediaPlayerHome.start();
}
}
现在,如何使用这个类 1)在您拥有媒体播放器的Activity / Fragment中创建此类的Object和MediaPlayer本地对象,或者您可以在MainActivity中创建它
private ApplicationContextHolder App;
private MediaPlayer mMediaPlayer;
2)在OnCreate中初始化对象
App = ApplicationContextHolder.getAppInstance();
mMediaPlayer = App.getMediaPlayerForHome(getActivity(),
R.raw.new_introduction);
3)最后如果你想播放音乐播放器
App.startMediaPlayerHome();
4)并覆盖最后一个Activity的OnDestory(),如果按下后退按钮,应用程序将关闭
public void onDestroy() {
try {
App.stopMediaPlayerHome();
} catch (IllegalStateException e) {
e.printStackTrace();
}
super.onDestroy();
}
这只是基本原理,但是你可以使用setLooping()/ Pause();以及如果你想要的所有方法
最后一步是在应用程序标记第一行的Manifest.xml中注册此类,如下所示
<application
android:name="yourpackagename.ApplicationContextHolder"
这是一个实时应用的工作代码,所以请试一试
对于主页按钮事件,您必须在每个活动中使用以下代码 编辑:此代码现在按Home键暂停媒体播放器,
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_HOME)) {
System.out.println("KEYCODE_HOME");
try {
App.pauseMediaPlayerHome();
} catch (IllegalStateException e) {
e.printStackTrace();
}
return true;
}
return false;
}
假设您想要在恢复应用程序时恢复音乐,则必须检查特定活动中的布尔值
if (mediaplayerPaused)
App.startMediaPlayerHome();