【问题标题】:How to prevent onCreate when application is resumed?应用程序恢复时如何防止onCreate?
【发布时间】:2016-06-19 01:29:28
【问题描述】:

我制作了一个音乐播放器 usim MediaPlayer。当我关闭应用程序时,歌曲会继续播放,但当我恢复时,会调用 onCreate,一切都会重新开始,上一首歌曲也会继续播放。因此,如果现在我开始新歌,即使只有一个 MediaPlayer 变量,这两首歌也会播放。为什么在重新打开应用程序时调用 onCreate。有什么办法可以预防?

编辑:请注意,xml 文件也会被重置。另外,我在离开应用程序之前失去了对歌曲播放的控制。

public class MainActivity extends AppCompatActivity {

SeekBar seekBar;
MediaPlayer mediaPlayer;
ImageView imageView;
Handler handler = new Handler();
private String[] mAudioPath;
private String[] mMusicList;
static int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button ctrl = (Button) findViewById(R.id.play);
    Button stop = (Button) findViewById(R.id.stop);
    imageView = (ImageView) findViewById(R.id.imageView);
    ListView listView = (ListView) findViewById(R.id.listView);
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.song);
    seekBar.setMax(mediaPlayer.getDuration());

    //get tracks list
    mMusicList = getAudioList();
    mAudioPath = getmAudioPath();

    ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusicList);
    listView.setAdapter(mAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //Toast.makeText(MainActivity.this,mAudioPath[position],Toast.LENGTH_SHORT).show();
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(mAudioPath[position]);
                mediaPlayer.prepare();
                mediaPlayer.seekTo(0);
                seekBar.setMax(mediaPlayer.getDuration());
                seekBar.setProgress(0);
                ctrl.setText("║");
                try {
                    byte[] art;
                    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
                    mediaMetadataRetriever.setDataSource(mAudioPath[position]);
                    art = mediaMetadataRetriever.getEmbeddedPicture();
                    Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length);
                    imageView.setImageBitmap(songImage);
                }
                catch (Exception e){
                    byte[] art;
                    Bitmap songImage = BitmapFactory.decodeResource(getResources(), R.drawable.default_artwork);
                    imageView.getLayoutParams().width= ViewGroup.LayoutParams.MATCH_PARENT;
                    imageView.setImageBitmap(songImage);
                }
                mediaPlayer.start();
                handler.postDelayed(runnable,1);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
});

    //Get track data
    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(MainActivity.this, Uri.parse("android.resource://in.swapsha96.playtime/"+R.raw.song));
    String artist;
    artist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
    if (artist == null)
        artist = "Unknown Artist";
    try {
        byte[] art;
        art = mediaMetadataRetriever.getEmbeddedPicture();
        Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length);
        imageView.setImageBitmap(songImage);
    }
    catch (Exception e){
        imageView.setBackgroundColor(Color.BLACK);
    }
    Toast.makeText(MainActivity.this,artist,Toast.LENGTH_SHORT).show();

    //Controls
    ctrl.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
                ctrl.setText("║");
            }
            else {
                mediaPlayer.pause();
                ctrl.setText("►");
            }
            seekBar.setProgress(mediaPlayer.getCurrentPosition());
            handler.postDelayed(runnable,1);
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mediaPlayer.pause();
            mediaPlayer.seekTo(0);
            ctrl.setText("►");
        }
    });

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            handler.removeCallbacks(runnable);
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            handler.removeCallbacks(runnable);
            mediaPlayer.seekTo(seekBar.getProgress());
            handler.postDelayed(runnable,1);
        }
    });
}

//update seekBar
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        seekBar.setProgress(mediaPlayer.getCurrentPosition());
        handler.postDelayed(this,1);
    }
};
private String[] getAudioList() {
    final Cursor mCursor = getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null,
            "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC");

    int count = mCursor.getCount();

    String[] songs = new String[count];
    String[] mAudioPath = new String[count];
    int i = 0;
    if (mCursor.moveToFirst()) {
        do {
            songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
            mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
            i++;
        } while (mCursor.moveToNext());
    }

    mCursor.close();

    return songs;
}private String[] getmAudioPath() {
    final Cursor mCursor = getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null,
            "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC");

    int count = mCursor.getCount();

    String[] songs = new String[count];
    String[] path = new String[count];
    int i = 0;
    if (mCursor.moveToFirst()) {
        do {
            songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
            path[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
            i++;
        } while (mCursor.moveToNext());
    }

    mCursor.close();

    return path;
}
}

【问题讨论】:

  • 您需要提供更多信息。你说的是哪个onCreate()
  • onCreate 在 MainActivity.java 中

标签: android android-mediaplayer oncreate


【解决方案1】:

如您所知:onCreate()onStart()onResume() 将在您启动 Activity 时被调用。因此为避免 onCreate 召回,您可以在 onCreate 方法中使用布尔值,例如 @987654326 @即设置为false,然后在第一次使用onCreate时设置为true。这是一个你可以从中得到启发的例子:

@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
// Other stuff

if (!isActivityReopened) {
    // Run what do you want to do only once.

    // To avoid onCreate() if it will be called a second time,
    // so put the boolean to true
    isActivityReopened = true;
 }
}

【讨论】:

    【解决方案2】:

    在您的代码中,您不会在每次选择新歌曲时检查媒体播放器是否正在播放。

    if(mediaPlayer.isPlaying())
      {mediaplyer.stop()}
    

    您需要停止它,然后重新设置它。 也尝试将activitg标签的Manifest文件中的启动模式设置为singleTask。

    <activity
            android:name=".MainActivity"
            android:launchMode="singleTask">
    

    如果您希望自己摆脱这一切,我对您的建议是使用绑定服务。它将帮助您管理媒体播放器状态并将继续在后台运行。这个很棒的tutorial 可能会有所帮助。

    【讨论】:

    • 这应该是评论,而不是答案。
    • 我还需要 4 分才能发表评论。无论如何,如果他提供更多详细信息,我将对其进行编辑并回答他。
    • 事情是当我按下回然后点击应用程序时,onCreate 被执行,因为一切都被重置了,音乐仍在播放。我绝对希望我的应用能够像其他音乐播放器一样工作。
    • 听起来您正在同时创建同一个活动的两个实例。您是否尝试过将活动标签中的启动模式设置为 singleTask。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2012-08-07
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多