Жизненный цикл при вызове фрагмента заменить или открыть новое действие?

Это фрагмент, который отображает видео.

Этот фрагмент может либо

1) открыть новую активность по нажатию кнопки

2) заменить другим фрагментом, вызвав

fragmentManager.beginTransaction().replace(R.id.container, f).addToBackStack(tag).commit();

для 1) случая, я хотел бы позвонить player.stopPlayBack() остановить воспроизведение видео при поддержке

А для 2) случая я хотел бы позвонить player.stopPlayBack() а также player.release() прекратить игрока

Проблема в том, какое событие я должен назвать для случаев 1) и 2)? Я пытаюсь использовать onPause или onStop, но они оба, похоже, не сработали.

Как это исправить?

Большое спасибо за помощь.

Обновлено:

Кодфрагмента видео

public class Video extends Fragment implements MediaPlayer.OnPreparedListener {
    @Bind(R.id.player) EMVideoView player;
    @Bind(R.id.full_screen) ImageView full_screen;
    Context ctx;
    MyApp app;
    String video_url;
    int intent_code = 5545;
    int pos;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.video, container, false);
        ButterKnife.bind(this, view);

        Bundle bundle = this.getArguments();
        video_url = bundle.getString("video_url");
        String id = bundle.getString("id");

        app = (MyApp) getActivity().getApplicationContext();
        app.record_view(id);

        Main m = (Main)getActivity();
        m.toggle_upload_btn(false);

        pos = 0;

        full_screen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getActivity(), VideoFullScreen.class);
                i.putExtra("video_url", video_url);
                i.putExtra("time", (int) player.getCurrentPosition());
                startActivityForResult(i, intent_code); //random intent number
            }
        });

        return view;
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        player.seekTo(pos);
        player.start();
    }

    @Override
    public void onResume() {
        super.onResume();
        player.setOnPreparedListener(this);
        player.setVideoURI(Uri.parse(video_url));
    }

    @Override
    public void onStop() {
        super.onStop();
        player.stopPlayback();
        //player.release();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == intent_code) {
            if(resultCode == Activity.RESULT_OK){
                pos = data.getIntExtra("time", 0);
            }
        }
    }

1 ответ

Решение

Когда фрагмент добавляется в backstack, а затем заменяется или удаляется - он будет выглядеть так:

onPause() -> onSaveInstanceState() -> onStop() -> onDestroyView() 

Если фрагмент удаляется или заменяется без добавления в задний стек, происходит следующее:

onPause() -> onSaveInstanceState() -> onStop() -> onDestroyView()  -> onDestroy() -> onDetach() -> Fragment is destroyed.

И когда действие начинает другое действие ( источник):

Порядок обратных вызовов жизненного цикла четко определен, особенно когда два действия находятся в одном и том же процессе, и одно запускает другое. Вот порядок операций, которые происходят, когда действие A запускает действие B:

Выполняется метод onPause() операции А. Методы onCreate(), onStart() и onResume() операции B выполняются последовательно. (Действие B теперь имеет фокус пользователя.) Затем, если действие A больше не отображается на экране, выполняется его метод onStop().

Потому что вам нужно вызвать свою деятельность там, где есть ваш фрагмент, чтобы начать новую деятельность.

Другие вопросы по тегам