gpt4 book ai didi

java - 设置新的 setContentView 时 MediaPlayer 被销毁

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:03 25 4
gpt4 key购买 nike

当我点击按钮时,它会将页面的布局从布局A更改为布局B。我的问题是我想让我的MediaPlayer保持 Activity 状态,但更改布局会破坏它。

如何防止这种情况发生?

我已经尝试过

onSavedInstanceState (but this method doesn't save MediaPlayer state or atleast in my knowledge)

SharedPreferences (same result as above)

我的按钮代码很简单

    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 更改为具有 2 个 SurfaceView 的布局 B。膨胀布局将使 MediaPlayer 保持 Activity 状态,但表面不正确遵循布局

最佳答案

  1. 您应该使用媒体播放器来播放音乐。

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);
}
});
  • 其中relativeLayout是第一个布局的一部分,因此您只需使用这个布局来膨胀另一个布局。

    @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();
    }
  • 服务代码...当您的服务绑定(bind)时,然后初始化服务中的媒体播放器。

     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";

    }
  • 所以您的服务不会打扰这里。即使您更改布局。

  • 关于java - 设置新的 setContentView 时 MediaPlayer 被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39585792/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com