如何只在前台播放音乐

时间:2016-10-17 12:51:44

标签: android service android-mediaplayer

我很难在所有活动中播放音乐,我实现了服务并处理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);



    }

3 个答案:

答案 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();
    }
}