【问题标题】:How do I prevent my media player from stopping when I switch activities but NOT when I hit HOME?如何防止我的媒体播放器在我切换活动时停止,而不是在我点击 HOME 时停止?
【发布时间】:2013-02-02 19:59:35
【问题描述】:

我有一个播放音乐的应用程序。 (您也可以关闭选项菜单。)

但问题是当你按下home键时,音乐一直在播放,我想在用户按下home键时停止音乐。

我尝试将 onPause() 和 onStop() 方法放到 music.stop() 中。但它失败了,因为当我开始一个新活动时,音乐也会停止,但我不希望它停止,只有当按下 Home 按钮时。

我的代码是:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.options);
     it=(RadioButton)findViewById(R.id.radio0);
     ti=(RadioButton)findViewById(R.id.radio1);
     but=(ToggleButton)findViewById(R.id.toggleButton1);
     music=MediaPlayer.create(Options.this, R.raw.avril);
   mainmenu=new Intent("com.KAYA.ingilizce_gelistirme.BASLANGIC");


    but.setOnClickListener(new View.OnClickListener()   {

        @Override
        public void onClick(View v) {
            if(but.isChecked()) {
                if(!music.isPlaying())
            music.start();
            }
            else
            if(music.isPlaying())
            music.pause();

        }
    });
     it.setChecked(true);
     Button menu=(Button)findViewById(R.id.button1);
     menu.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(mainmenu);
        }
    });

}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub


    startActivity(new Intent(mainmenu));
    }


@Override
protected void onPause() {

    if(music.isPlaying()){
    music.pause();
    music.release();
    }
    but.setChecked(false);

    super.onPause();

}



@Override
protected void onResume() {
    super.onResume();

}

这里是音乐开始播放的OPTIONS ACTIVITY,但是当我通过菜单活动时,音乐也停止了。

【问题讨论】:

    标签: android android-layout android-intent android-activity android-music-player


    【解决方案1】:

    您需要启动一个单独的服务来播放音乐。

    方法一

    这种方法更适合大型应用程序。

    在您的音乐服务中定期(例如每 3 秒一次)调用以下类,以查看您的应用是否在后台。信用:check android application is in foreground or not?

    class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Context... params) {
            final Context context = params[0];
            return isAppOnForeground(context);
        }
    
        private boolean isAppOnForeground(Context context) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
            if (appProcesses == null) {
                return false;
            }
            final String packageName = context.getPackageName();
            for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
                if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
                    return true;
                }
            }
            return false;
        }
    }
    

    方法2

    接下来,当您检测到您的应用程序已被后台处理时,您需要关闭您的服务。见这里:Checking if an Android application is running in the background。请注意,您不想在每个类中手动覆盖 onPause 和 onResume。您想尽可能使用共同的祖先。

    【讨论】:

    • 我认为这是合乎逻辑的,非常感谢,我会尝试所有这些,我希望它有效:)
    【解决方案2】:

    我可以推荐两种方法

    1) 让它在onPause() 中,创建一个flag/boolean,默认情况下将设置为false,并且在任何情况下都将是true,例如新活动启动、后按等。所以如果onPause 被调用并且 flag 为 false 你可以停止音乐。

    2) 你已经有后台service,你可以继续检查前台是哪个活动,如果是homeScreen,你可以停止音乐。

    编辑:- 了解您的应用是否不在前台。正如布赖恩在另一个答案中所建议的那样。请参阅here you can find if app is foreground or in background 并采取相应措施

    【讨论】:

    • 如何查看后台服务是否为homeScreen?我尝试了你的第一个建议,但有一个问题,我认为所有的可能性,但布尔标志是无用的,我认为唯一的解决方案是检查主屏幕,但我找不到任何代码来检查
    • 因为,如果你传递了另一个 Activity,你的 flag 也将是 false。这会崩溃。
    • 怎么会是假的?使其全球化。处理所有可能性然后主屏幕,因为 HomeScreen 事件不能被监听?
    • 兄弟,如果你调用一个新的Activity,也会调用onPause()。这与按主页和通过其他活动没有区别
    • 是的,但是如果调用另一个活动,你不能将标志更改为 true,好吧,使用编辑过的答案,这样泄漏的机会会更少吗?
    【解决方案3】:

    我发现最好的方法是在你的应用程序类中有一个静态布尔值,称为“活动”或其他东西。当您的任何活动暂停时将其设置为 false,当您的活动恢复时将其设置为 true。 然后在 onStop 方法中检查“活动”的状态。如果它是假的,你可以安全地假设用户点击了主页并且没有其他活动开始。在此处关闭媒体播放器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多