如何只在前台播放音乐
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));
我无法在所有 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));