Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-当应用程序进入后台时停止声音_Android_Performance_Android Activity_Android Mediaplayer - Fatal编程技术网

android-当应用程序进入后台时停止声音

android-当应用程序进入后台时停止声音,android,performance,android-activity,android-mediaplayer,Android,Performance,Android Activity,Android Mediaplayer,我使用以下代码停止在应用程序后台循环播放的音乐当应用程序转到后台时,它在模拟器上工作,而不是在手机上。即使我退出应用程序,声音仍在播放,有人找到解决方案吗?我会非常感激的 @Override protected void onPause() { super.onPause(); Context context = getApplicationContext(); ActivityManager am = (ActivityManager) context.getSystemService(Con

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

@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();
  }
}
主要内容:


您应该使用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中注册

主要内容:

公共类MainActivity扩展活动{
ImageView startB;
位图b=null;
int-keyCode=0;
布尔onKeyDown=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getApplication().registerActivityLifecycleCallbacks(新的MYLifeCycleHandler(getApplication());//新错误:构造函数MYLifeCycleHandler未定义
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,
WindowManager.LayoutParams.FLAG(全屏);
/*使图像适应显示器的大小*/
Display d=getWindowManager().getDefaultDisplay();
点p=新点();
d、 getSize(p);
b=位图.createScaledBitmap(
BitmapFactory.decodeResource(getResources(),R.drawable.screen1),//b
p、 x,p.y,正确);
setContentView(R.layout.activity_main);
RelativeLayout rl=(RelativeLayout)findViewById(R.id.rl1);
rl.setBackgroundDrawable(新的BitmapDrawable(getResources(),b));
ImageView startB=(ImageView)findViewById(R.id.startbutton);
MusicManager.getInstance().initializeMediaPlayer(this,R.raw.rock);
MusicManager.getInstance().playMusic();
if(keyCode==KeyEvent.keyCode\u HOME)
{
onKeyDown=true;
}
startB.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Intent myIntent=newintent(getApplicationContext(),WorkoutPlace2.class);
星触觉(myIntent);
完成();
}
});
}
@凌驾
public void onBackPressed(){
意向意向=新意向(意向.行动\主要);
intent.addCategory(intent.CATEGORY_HOME);
intent.setFlags(intent.FLAG\u活动\u新任务);
星触觉(意向);
android.os.Process.killProcess(android.os.Process.myPid());
}
公共无效onHomePressed(){
如果(onKeyDown=true){
AudioManager=(AudioManager)getSystemService(Context.AUDIO\u服务);
manager.setStreamMute(AudioManager.STREAM_MUSIC,true);
android.os.Process.killProcess(android.os.Process.myPid());
}
}
/*@凌驾
公共布尔onKeyDown(int-keyCode,KeyEvent事件)
{
if(keyCode==KeyEvent.keyCode\u HOME)
{
android.os.Process.killProcess(android.os.Process.myPid());
}
返回super.onKeyDown(keyCode,event);
}*/
@凌驾
受保护的void onPause(){
super.onPause();
Context=getApplicationContext();
ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
List taskInfo=am.getRunningTasks(1);
如果(!taskInfo.isEmpty()){
ComponentName topActivity=taskInfo.get(0).topActivity;
如果(!topActivity.getPackageName().equals(context.getPackageName())){
MusicManager.getInstance().stopMusic();
Toast.makeText(MainActivity.this,“您离开了应用程序”,Toast.LENGTH_SHORT.show();
AudioManager=(AudioManager)getSystemService(Context.AUDIO\u服务);
manager.setStreamMute(AudioManager.STREAM_MUSIC,true);
}
}
如果(b!=null){
b、 回收();
b=零;
}
}
@凌驾
受保护的void onResume(){
super.onResume();
MusicManager.getInstance().playMusic();
}
}
MYLifeCycleHadler:


与您更新的帖子中的内容一模一样

您看到祝酒词了吗?不,我没有看到,但是任务权限确实在安装过程中出现,我正在Galaxy S4上测试您是如何开始播放音乐的?如果(!taskInfo.isEmpty()),这是真的吗?为什么变量标记,也应该是私有的应用程序?我得到一个警告变量未使用。此外,当我在第一个活动中注册回调时,出现一个get错误“无法从类型活动中静态引用非静态方法getApplication()”,我已更新了代码。我粘贴了我正在使用的代码,因此有一些变量不是应用程序所需的,如果您在活动的onCreate方法中注册,则不会出现该错误。你能写下你的代码吗?现在当我在“activity.getApplication()”中注册时,我得到了一个错误,它说activity不能被解析。你能写一些代码吗?这样我就可以检查出什么问题了?
 @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());
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();
}
}