Жизненный цикл при вызове фрагмента заменить или открыть новое действие?
Это фрагмент, который отображает видео.
Этот фрагмент может либо
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().
Потому что вам нужно вызвать свою деятельность там, где есть ваш фрагмент, чтобы начать новую деятельность.