【问题标题】:android - stopping sound when the application goes to backgroundandroid - 当应用程序进入后台时停止声音
【发布时间】:2015-02-03 00:47:20
【问题描述】:

当应用程序进入后台时,我使用以下代码停止在应用程序后台循环播放的音乐,它可以在模拟器上运行,而不是在手机上运行。即使我退出应用程序时声音仍在播放,有人有解决方案吗?我会很感激的

@Override
protected void onPause() {
super.onPause();
Context context = getApplicationContext();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
if (!taskInfo.isEmpty()) {
  ComponentName topActivity = taskInfo.get(0).topActivity; 
  if (!topActivity.getPackageName().equals(context.getPackageName())) {
      MusicManager.getInstance().stopMusic();
    Toast.makeText(MainActivity.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show();
  }
}

更新:

音乐管理器:

public class MusicManager {
MediaPlayer mp = null;
private static MusicManager refrence = null;

public static MusicManager getInstance(){
if(refrence==null){
    refrence = new MusicManager();
}
return refrence;
}
public void initializeMediaPlayer(Context context, int musicID){ 
mp = MediaPlayer.create(context, R.raw.rock);
 mp.setLooping(true);   
 try {
        mp.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void playMusic(){
mp.start();
}
public void stopMusic(){
    if (mp != null) {
    mp.stop();
    mp.release();
}

}
}

主要:

MusicManager.getInstance().initializeMediaPlayer(this, R.raw.rock);
MusicManager.getInstance().playMusic();

【问题讨论】:

  • 你看到吐司了吗?
  • 不,我没有,但是安装过程中确实出现了任务权限,我正在 Galaxy S4 上测试
  • 你是如何开始播放音乐的?
  • if (!taskInfo.isEmpty()) ,这是评估为真吗?

标签: android performance android-activity android-mediaplayer


【解决方案1】:

这是代码

主要:

public class MainActivity extends Activity{

ImageView startB;
Bitmap b = null;
int keyCode = 0;
boolean onKeyDown = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getApplication().registerActivityLifecycleCallbacks(new MYLifeCycleHandler(getApplication())); // New error:the constructor MYLifeCycleHandler is undefined
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    /* adapt the image to the size of the display */
    Display d = getWindowManager().getDefaultDisplay();
    Point p = new Point();
    d.getSize(p);
    b = Bitmap.createScaledBitmap(
            BitmapFactory.decodeResource(getResources(), R.drawable.screen1),//b
            p.x, p.y, true);

    setContentView(R.layout.activity_main);

    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl1);
    rl.setBackgroundDrawable(new BitmapDrawable(getResources(), b));

    ImageView startB = (ImageView) findViewById(R.id.startbutton);
    MusicManager.getInstance().initializeMediaPlayer(this, R.raw.rock);
    MusicManager.getInstance().playMusic();

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        onKeyDown = true;
    }

     startB.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent myIntent = new Intent(getApplicationContext(), WorkoutPlace2.class);
                startActivity(myIntent);
                finish();
            }
        });
}
@Override
public void onBackPressed(){
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    android.os.Process.killProcess(android.os.Process.myPid());
}
public void onHomePressed(){
    if (onKeyDown = true){
        AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        manager.setStreamMute(AudioManager.STREAM_MUSIC, true);
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        android.os.Process.killProcess(android.os.Process.myPid());
    }
    return super.onKeyDown(keyCode, event);
}*/

@Override
protected void onPause() {
    super.onPause();
    Context context = getApplicationContext();
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
    if (!taskInfo.isEmpty()) {
      ComponentName topActivity = taskInfo.get(0).topActivity;
      if (!topActivity.getPackageName().equals(context.getPackageName())) {
          MusicManager.getInstance().stopMusic();
        Toast.makeText(MainActivity.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show();
        AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        manager.setStreamMute(AudioManager.STREAM_MUSIC, true);
      }
    }
    if (b != null){
        b.recycle();
        b = null;
    }
}
@Override
protected void onResume(){
    super.onResume();
    MusicManager.getInstance().playMusic();
}
}

MYLifeCycleHadler:

与您更新后的帖子完全相同

【讨论】:

    【解决方案2】:

    您应该使用activitylifecyclecallbacks 来检查应用程序是前台还是后台。它是在 api 级别 14 中添加的。 您可以使用以下代码

     @SuppressLint("NewApi")
     public class MYLifeCycleHandler implements ActivityLifecycleCallbacks 
     {
      private static int resumed;
      private static int paused;
      private static int started;
      private static int stopped;
    
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) 
      {
      }
    
      @Override
      public void onActivityDestroyed(Activity activity) 
      {
      }
    
      @Override
      public void onActivityResumed(Activity activity)
      {
        ++resumed;
      }
    
      @Override
      public void onActivityPaused(Activity activity)
      {
        ++paused;
      }   
    
      @Override
      public void onActivityStarted(Activity activity) {
        ++started;        
        if(started > stopped)
        {
        //start music player if not already running
        MusicManager.getInstance().playMusic();
        }
       }
    
      public boolean isApplicationInForeground() 
      {
        return resumed > paused;
      }
      @Override
      public void onActivityStopped(Activity activity) {
        ++stopped;
        //if application in background
        if(stopped == started)
        {
            //stop music player if running
           MusicManager.getInstance().stopMusic();
        }
       }
    
       @Override
       public void onActivitySaveInstanceState(Activity activity, Bundle outState)       
       {        
       }
      }    
    

    您应该按如下方式注册回调

    getApplication().registerActivityLifecycleCallbacks(new MPLifeCycleHandler());
    

    最好在你的第一个活动的 onCreate 中注册

    【讨论】:

    • 为什么变量TAG,Application app_也应该是私有的?我收到警告变量未使用。
    • 此外,当我在第一个活动中注册回调时,出现错误“无法从 Activity 类型对非静态方法 getApplication() 进行静态引用”
    • 我已经更新了代码。我已经粘贴了我正在使用的代码,因此您的应用程序不需要一些变量,如果您在活动的 onCreate 方法中注册,那么您将不会收到该错误。你能把你的代码吗?
    • 现在当我注册时,我在“activity.getApplication()”位中出现错误,它表示无法解析活动
    • 你能贴一些代码让我检查一下有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多