Как предотвратить onCreate при возобновлении работы приложения?

Я сделал музыкальный проигрыватель с помощью MediaPlayer. Когда я закрываю приложение, песня продолжает играть, но когда я возобновляю работу, вызывается onCreate, все начинается снова, и предыдущая песня также продолжает играть. Поэтому, если сейчас я начну новую песню, воспроизводятся обе песни, даже если есть только одна переменная MediaPlayer. Почему onCreate вызывается при повторном открытии приложения. Как это предотвратить?

EDIT: Обратите внимание, что 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;
}
}

person Swapnil Sharma    schedule 19.06.2016    source источник
comment
Вам нужно дать больше информации. О каком onCreate() ты говоришь?   -  person Karakuri    schedule 19.06.2016
comment
onCreate внутри MainActivity.java   -  person Swapnil Sharma    schedule 19.06.2016


Ответы (2)


Как вы знаете: onCreate(), onStart() и onResume() будут вызываться при запуске Activity. Поэтому, чтобы избежать отзыва onCreate, вы можете использовать логическое значение в своем методе onCreate, например isActivityReopened, для которого установлено значение false, а затем установлено значение true при первом использовании. onCreate. Вот пример, который вы можете вдохновить из него:

@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;
 }
}
person BOUTERBIAT Oualid    schedule 19.06.2016

В вашем коде вы не проверяете, воспроизводился ли медиаплеер или нет каждый раз, когда вы выбираете новую песню.

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

вам нужно остановить его, а затем сбросить его снова. попробуйте также установить режим запуска в файле манифеста тега activitg как singleTask.

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

Мой вам совет, если вы хотите избавиться от всего этого, — используйте связанный сервис. Это поможет вам управлять состояниями медиаплеера и будет продолжать работать в фоновом режиме. Этот замечательный учебник может помочь.

person jelmood jasser    schedule 19.06.2016
comment
Это должен быть комментарий, а не ответ. - person Karakuri; 19.06.2016
comment
Мне нужно еще 4 балла, чтобы я мог прокомментировать. В любом случае, если он предоставит более подробную информацию, я отредактирую ее и отвечу ему. - person jelmood jasser; 19.06.2016
comment
Дело в том, что когда я нажимаю назад, а затем нажимаю на приложение, выполняется onCreate, из-за которого все сбрасывается и все равно музыка все еще играет. Я определенно хочу, чтобы мое приложение работало как другие музыкальные проигрыватели. - person Swapnil Sharma; 19.06.2016
comment
Похоже, вы одновременно создаете два экземпляра одного и того же действия. Вы пытались поместить режим запуска в тег активности как singleTask. ‹Активность android:name=.MainActivity android:launchMode=singleTask - person jelmood jasser; 19.06.2016