【问题标题】:Lifecycle when calling the fragment replace or open new activity?调用片段替换或打开新活动时的生命周期?
【发布时间】:2016-01-14 07:37:39
【问题描述】:

是显示视频的片段。

这个片段可以

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,一个用于案例 2?如果是这样,为什么不在各自的 onClickListeners 中处理您的不同情况?
  • 只是阅读文档并有一些想法,1) 案例的 onpause 和 2) 案例的 onDetach?

标签: android events android-fragments android-lifecycle lifecycle


【解决方案1】:

当片段被添加到后台堆栈,然后被替换或删除时 - 它会像这样:

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

如果片段被删除,或者被替换而没有被添加到返回堆栈,那么会发生以下情况:

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

当一个活动开始另一个活动时(source):

生命周期回调的顺序是明确定义的,特别是当 这两个活动在同一个过程中,一个是启动 其他。这是 Activity A 时发生的操作顺序 启动活动 B:

Activity A 的 onPause() 方法执行。 Activity B 的 onCreate(), onStart() 和 onResume() 方法按顺序执行。 (活动 B 现在 有用户焦点。)然后,如果 Activity A 在屏幕上不再可见, 它的 onStop() 方法执行。

因为您需要调用片段所在的 Activity 来启动新的 Activity。

【讨论】:

  • 这意味着片段创建新活动或替换片段将覆盖同一事件?
  • 是的,因此您不应在生命周期方法中控制特定案例的播放。
  • 感谢您的回复。另外,我在 onStop 声明了 video.stopplayback() ,当我使用片段替换时,视频不会停止并继续播放,所以如果我替换更多片段然后同时播放更多视频,有什么想法可以解决吗?谢谢
  • 什么是对象播放器?你 stopPlayback() 是什么?
  • 据我所知,它应该可以工作 - 在阅读了 EmVideoView 非常肤浅的文档之后,它看起来应该可以工作。你可以尝试在你的 imageviewClickListener 中使用那个 stopPlayBack() 吗?只需将意图注释掉,看看是否可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多