调用片段时的生命周期替换或打开新活动?

时间:2016-01-14 07:37:39

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

是一个显示视频的片段。

这个片段可以

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 个答案:

答案 0 :(得分:11)

当片段被添加到Backstack中,然后被替换或删除时 - 它将是这样的:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ManageYourTrip.mytguideapp.Voucher" >

    <LinearLayout
        android:id="@+id/voucherTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Voucher"
            android:textSize="24sp"
            android:textStyle="bold"/>
    </LinearLayout>


    <TextView
        android:id="@+id/TV_Date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@id/voucherTitle"
        android:text="Date: "
        android:textSize="12sp"
        android:textStyle="bold"
        >
    </TextView>

    <TextView
        android:id="@+id/TV_voucher_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/TV_Date"
        android:layout_below="@id/voucherTitle"
        android:textSize="12sp">
    </TextView>

    <TextView
        android:id="@+id/TV_supplier_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@id/TV_Date"
        android:text="Supplier Details:"
        android:textSize="12dp"
        android:textStyle="bold">
    </TextView>

    <TextView
        android:id="@+id/TV_supplier_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/TV_supplier_title"
        android:textSize="12dp">
    </TextView>

    <TextView
        android:id="@+id/LI_TV_suppliers_Address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/TV_supplier_name"
        android:textSize="12dp">
    </TextView>

    <TextView
        android:id="@+id/TV_products_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@id/LI_TV_suppliers_Address"
        android:text="PRODUCTS"
        android:textSize="12dp"
        android:textStyle="bold"
        android:layout_marginLeft="2dp">
    </TextView>

    <TextView
        android:id="@+id/TV_products_quantity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@id/LI_TV_suppliers_Address"
        android:text="Qty."
        android:textSize="12dp"
        android:textStyle="bold"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true">
    </TextView>

    <ListView
        android:id="@+id/ProductsList"
        android:layout_above="@+id/bottom_layout"
        android:layout_below="@+id/TV_products_title"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>

    <LinearLayout
        android:id="@+id/bottom_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/voucher_number"
                android:layout_marginTop="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="VOUCHER #"
                android:textSize="12dp"
                android:textStyle="bold">
            </TextView>

            <TextView
                android:id="@+id/TV_voucher_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="123"
                android:textSize="12dp">
            </TextView>

        </LinearLayout>

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/ProductsList"
        android:text="REF #"
        android:textSize="12dp"
        android:textStyle="bold">
    </TextView>

</RelativeLayout>

如果删除片段,或者在没有添加到后栈的情况下进行替换,则会发生以下情况:

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

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

  

生命周期回调的顺序已明确定义,尤其是在何时   这两个活动是在同一个过程中,一个是开始的   其他。这是活动A时发生的操作顺序   开始活动B:

     

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

因为您需要调用存在片段的活动,才能开始新的活动。