我很难在所有活动中播放音乐,我实现了服务并处理onPause以在转到背景时停止音乐(用户不可见)。
问题是当我导航到另一个活动时,会调用onPause方法使我的音乐停止。如何解决这个问题?我需要在前景中的所有活动中播放我的音乐,并且当应用程序在后台时不要播放它。任何人都知道如何解决这个问题。
这是我的基础活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startIntent = new Intent(getApplicationContext(), MusicService.class);
if(binder==null){
bindService(startIntent,this, Context.BIND_AUTO_CREATE);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(binder.getMyService()!=null){
stopService(startIntent);
unbindService(this);
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onPause() {
super.onPause();
if(binder!=null) {
binder.getMyService().pauseMusic();
}
}
@Override
protected void onResume() {
super.onResume();
if(binder!=null){
binder.getMyService().resumeMusic();
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MusicService.Binder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
这是我的主要活动扩展基础活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startIntent = new Intent(MainActivity.this, MusicService.class);
startService(startIntent);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void how(View view) {
Intent intent = new Intent(this, AboutActivity.class);
this.startActivity(intent);
}
答案 0 :(得分:0)
不要像Harin Kaklotar建议的那样停止onPause()
中的音频播放。您可以使用 onDestroy()
的方法,也可以在异步任务中使用 surfaceDestroyed()
关闭声音。如果您需要其他任何类型的东西,可以参考AudioManager的android文档。
https://developer.android.com/reference/android/media/AudioManager.html
希望我帮助过:D
<强>更新强>
您可以创建一个系统来检查您的应用是在前台还是后台。这涉及计算暂停的活动数量。将其添加到您的所有活动中:
@Override
protected void onPause() {
super.onPause();
MainActivity.Pause++;
}
@Override
protected void onResume() {
super.onResume();
MainActivity.Pause--;
}
在你的MainActivty中,
if (Pause == NUMBER_OF_ACTIVITIES) {
//PAUSE MUSIC HERE
}
答案 1 :(得分:0)
您可以实施能够跟踪应用中当前活动的代码。 (很好的例子:How to get current activity)
仅在当前活动&#34;是 null 。
PS:根据您跟踪当前活动的实施情况,您可能希望立即检查当前活动而不是onPause(),但会有一些延迟。
答案 2 :(得分:0)
您必须使用ActivityLifecycleCallbacks来判断您的应用是在前台还是后台。
例如:
<br/>
然后在Application.onCreate调用:
public class DummyActivityLifecycleCallbacks implements ActivityLifecycleCallbacks {
@Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { }
@Override public void onActivityStarted(Activity activity) { }
@Override public void onActivityResumed(Activity activity) { }
@Override public void onActivityPaused(Activity activity) { }
@Override public void onActivityStopped(Activity activity) { }
@Override public void onActivityDestroyed(Activity activity) { }
@Override public void onActivitySaveInstanceState(Activity activity, Bundle savedInstanceState) { }
}
public class OnApplicationForegroundBackgroundEnterCallbacks extends DummyActivityLifecycleCallbacks {
private Listener listener;
private int activityStartStopCounter = 0;
public interface Listener {
public void onEnterForeground();
public void onEnterBackground();
}
public OnApplicationForegroundBackgroundEnterCallbacks(Listener listener) {
this.listener = listener;
}
@Override public void onActivityStarted(Activity activity) {
if(++activityStartStopCounter == 1) listener.onEnterForeground();
}
@Override public void onActivityStopped(Activity activity) {
if(--activityStartStopCounter == 0) listener.onEnterBackground();
}
}