设置新的setContentView时,MediaPlayer被销毁

时间:2016-09-20 04:39:15

标签: java android layout android-mediaplayer

当我点击某个按钮时,它会将我的页面的layout从布局A更改为布局B.我的问题是我想让MediaPlayer保持活跃但更改layout摧毁它。

如何防止这种情况发生?

我试过了

  

onSavedInstanceState(但此方法并不保存MediaPlayer状态或据我所知至少)

     

SharedPreferences(与上面相同的结果)

我的按钮代码很简单

    view1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        setContentView(R.layout.activity_1);
      }
    });

    view2.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        setContentView(R.layout.activity_2);
      }
    });

修改

我正在播放直播,因此使用mp.seekTo(int)是不可取的

编辑2

在测试了给我的所有答案之后,给布局充气确实让它保持活力,但这并不是我的预期。

问题是,我想将具有1 SurfaceView的布局A更改为布局B,其中有2 SurfaceView。对布局进行充气会使MediaPlayer保持活动状态,但表面不能正确遵循布局

2 个答案:

答案 0 :(得分:0)

  1. 您应该使用该服务使用Media Player播放音乐。
  2. 2.您更改布局,使用LayoutInflator而不是“setContentView”,第二个布局应该是第一个布局的一部分更好。所以你的按钮用于改变布局,应该是第一次布局。

    3.使用以下代码它应该可以工作。

      button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.new_layout,relativeLayout);
        }
    });
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.new_layout2,relativeLayout);
        }
    });
    
    1. 其中relativeLayout是First Layout的一部分,因此您只需使用此布局来扩充另一个布局。

      @Override
      protected void onStart() {
          playIntent=new Intent(NewLayoutActivity.this,MusicService.class);
          //playIntent.putExtra(MusicService.URL,"http://charan.com/tcs/audio/Chandana_Charchita.mp3");
          playIntent.setAction(MusicService.MAIN_ACTION);
          startService(playIntent);
          bindService(playIntent,musicServiceConnection, Context.BIND_AUTO_CREATE);
          Log.i(TAG,"onStart Called");
          super.onStart();
      }
      
      public ServiceConnection musicServiceConnection=new ServiceConnection() {
      
          @Override
          public void onServiceConnected(ComponentName componentName, IBinder iBinderObject) {
              myBinder= (MusicService.MyBinder) iBinderObject;
      
              musicService=myBinder.getService();
              mConnection=true;
              musicService.initializeMediaPlayer("http://charan.com/tcs/audio/Chandana_Charchita.mp3");
              Log.i(TAG,"Service Bounded...");
      
          }
      
          @Override
          public void onServiceDisconnected(ComponentName componentName) {
              mConnection=false;
      
          }
      };
      
      @Override
      protected void onDestroy() {
          if(mConnection){
              unbindService(musicServiceConnection);
              mConnection=false;
          }
          super.onDestroy();
      }
      
    2. 服务代码......当您的服务受限时,请在服务中初始化媒体播放器。

       public void initializeMediaPlayer(String url){
      
           player.setAudioStreamType(AudioManager.STREAM_MUSIC);
          player.setOnPreparedListener(this);
          player.setOnErrorListener(this);
          player.setOnCompletionListener(this);
      
         if(TextUtils.isEmpty(url)){
             url=defaultUrl;
         }
         try {
             player.setDataSource(url);
            // player.prepareAsync();
             player.prepare();
             player.start();
             player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
         } catch (IOException e) {
             e.printStackTrace();
         }
        // mState="preparing";
          mState="playing";
      
      }
      
    3. 所以您的服务不会在这里打扰。即使你改变了布局。

答案 1 :(得分:0)

您可以使用Singleton类初始化任何对象一次,使用实例可以执行任何操作。

在你自己或应用程序被破坏之前它不会破坏。

我认为这肯定会解决你的目的。

快乐的编码!