如何只在前台播放音乐

How to play music only in foreground

我无法在所有 activity 中播放音乐,我已实施服务并处理 onPause 以在进入后台时停止音乐(用户不可见) .

问题是当我导航到另一个 activity 时,会调用 onPause 方法使我的音乐停止。如何解决这个问题?我只需要在前台的所有 activity 中播放我的音乐,并且不想在应用程序在后台播放时播放它。感谢任何知道如何解决这个问题的人。

这是我的基地activity

@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) {

}

这是我的主要activity extends base activity

@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);



    }

不要像 Harin Kaklotar 建议的那样停止 onPause() 中的音频播放。你可以用他的方法 onDestroy() 或者你可以在异步任务中使用 surfaceDestroyed()[=30 关闭声音=].如果您需要其他任何东西,可以参考 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
  }

您可以在您的应用程序中实现跟踪当前 activity 的代码。 (很好的例子:How to get current activity

并且仅当 "current activity" 为 null 时停止音乐。

PS:根据您跟踪当前 activity 的实施情况,您可能希望立即检查当前 activity 而不是 onPause(),但有一些延迟。

您必须使用 ActivityLifecycleCallbacks 来判断您的应用是在前台还是后台。

例如:

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

然后在Application.onCreate调用:

registerActivityLifecycleCallbacks(new OnApplicationForegroundBackgroundEnterCallbacks(this));