在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止
Posted
技术标签:
【中文标题】在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止【英文标题】:Play background music across all my activities, and stop it only when my app is not displayed 【发布时间】:2013-01-23 12:10:33 【问题描述】:我尝试了一百万种方式,但是当我播放手机的 HOME 按钮时,音乐一直在播放。 我最后一次尝试是应用程序,但我仍然遇到同样的问题。
这是我的代码。
public class ProvaMusica extends Application
Intent musica_backGround;
public Background_music musicaDiBackground = new Background_music();
public void avvia()
//this is the class where i manage mediaplayer//////////
musica_backGround=new Intent(this, Background_music.class);
startService(musica_backGround);
public void onDestroy()
stopService(musica_backGround);
在我的第一个活动中,我使用此代码开始播放音乐
ProvaMusica appState = ((ProvaMusica)this.getApplication());
appState.avvia();
现在,我应该怎么做才能在显示其他活动时让音乐播放,而在我的应用不显示时让音乐停止?
我希望音乐在从一项活动转移到另一项活动时继续播放,我不想在新活动开始时停止音乐然后重新开始。
【问题讨论】:
您是否尝试过覆盖 onPause() 并停止音乐? 是的,如果我在 onPause() 中停止音乐,当我更改活动时,音乐就会停止。我只想在我的应用被破坏或未显示时停止播放音乐 【参考方案1】:我这样做的方法是:
-
我有一个单例类,即 SoundManager。
在 onPause 时,每个活动都会调用 soundManager.stopPlayingDelayed。此方法启动一个计时器,该计时器将在 1 或 2 秒内调用 soundManager.checkIfShouldStop。它还将 lastCloseTime 保存到当前时间。
onResume 上的每个活动都会调用 soundManager.startPlaying。如果已经播放声音管理器将忽略该请求。这也清除了 lastCloseTime
在 checkIfShouldStop 中,如果 lastCloseTime 不为零且超过 1 秒前,则表示在最后一个活动完成后,我的应用没有新的活动启动,因此应该停止音乐。
【讨论】:
【参考方案2】:您可以拥有一个Application
类并将其设置在androidManifest
中。在其onDestroy()
回调中,您可以使用stopService()
函数停止服务,也可以使用Intent
启动服务来停止音乐。
【讨论】:
如果活动不可见,是否会首先调用onPause()
?
是的,会先调用onPause()
,再调用onDestroy()
我编辑了我的帖子。我尝试使用应用程序,但我仍然有同样的问题。你可以看看吗?
调用Application类中的方法后音乐是否开始播放?如果是这样,您是否在 Application 类中使用 onDestroy() 通过 stopService() 函数停止服务?
是的,我做到了.. 我想我做到了!我再次编辑了我的代码。我做错了什么?【参考方案3】:
您的应用在 Android 操作系统中作为一个进程运行。 Android 操作系统有多种终止进程的方法,有时在进程被终止之前可能不会调用像 onDestroy() 这样的回调函数。因此,如果您在服务中启动并播放音乐,只要您的进程存在,音乐就会一直播放。但是,如果您希望它停止,当您的应用程序的特定活动被终止时,您可以覆盖该活动的 onDestroy() 并为您的服务广播一条消息以停止音乐。 使用服务来实现。
【讨论】:
我无法覆盖 onFinish() 方法。我收到此错误消息The method onFinish() of type MainActivity must override or implement a supertype method
我在 Internet 上查找此错误,但没有找到解决方案。我做错了什么?
对于活动,你应该重写 onDestroy() 方法,对不起。如果进程被杀死,onDestroy() 方法可能不会被调用,但如果活动在导航到其他地方后被销毁,它将被调用。如果进程被操作系统或用户杀死,您的服务将不可避免地停止,无需担心。我希望这会有所帮助【参考方案4】:
也许我找到了一种方法来混合大家给我的建议。
使用此代码,背景音乐(在本例中由服务管理)仅在用户使用后退按钮关闭应用程序、用户使用主页按钮关闭应用程序以及屏幕关闭时停止,因为用户使用设备的锁定按钮。
我希望有人比我更专业、更擅长编程来确认这是正确的
在这个课程中,我检查我当前的活动是否在前台
public class GestioneApplicazioneInBackground
public static boolean applicazioneInBackground(final Context context)
ActivityManager am = (ActivityManager) MainActivity.context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty())
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName()))
return true;
return false;
在我所有活动的 onStop() 和 onPause() 方法中,我都有这段代码
/// if my app and his activities are in background i stop the service i started in my main/first activity////
if(GestioneApplicazioneInBackground.applicazioneInBackground(this) )
context_of_the_Intent.stopService(intent);
else
// if my app and his activities are NOT in background i check if user turned off the screen with the lock button of the device//////
PowerManager kgMgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean showing = kgMgr.isScreenOn();
if(!showing)
context_of_the_Intent.stopService(intent);
【讨论】:
【参考方案5】:使用这个:Tf you usr media player then Call this method in your activity...
MediaPlayer mp=null;
@Override
protected void onDestroy()
super.onDestroy();
if (!(mp == null))
if (mp.isPlaying())
mp.stop();
mp.release();
mp = null;
;
v @Override
protected void onResume()
super.onResume();
if (!(mp == null))
if (mp.isPlaying())
mp.stop();
mp.release();
mp = null;
;
【讨论】:
以上是关于在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止的主要内容,如果未能解决你的问题,请参考以下文章
android - 如何在我的音乐播放器中从文件管理器播放 mp3 文件?