# Creating a player instance This article is a brief introduction to the player API to help you get quickly started. ## Add a player to an Activity There are two ways to add a player to an Activity: * **Option 1**: Use `FlowplayerView`. * **Option 2**: Use either `FlowplayerSupportFragment` or `FlowplayerFragment`, depending on whether or not your Activity inherits (directly or indirectly) from AndroidX's `FragmentActivity`. The second method is recommended since these two Fragments wrap `FlowplayerView` and handle its lifecycle automatically. Optionally, both these Fragments can also handle orientation changes and toggle fullscreen. ### Option 1: Add FlowplayerView The `FlowplayerView` is the core of the Wowza Flowplayer Android SDK. It can load a video/audio, control the playback, and subscribe to player related callbacks. It extends `FrameLayout` and can, therefore, be added either via xml or programmatically in an ordinary fashion: ```xml ``` Adding `FlowplayerView` gives you more control over its lifecycle. However, if you don't need this control, we recommend using either `FlowplayerFragment` or `FlowplayerSupportFragment` instead. If you decide to use `FlowplayerView` instead of `FlowplayerFragment` or `FlowplayerSupportFragment`, then you must manage its lifecycle. There are two ways to achieve this: 1. If your Activity or Fragment inherits (directly or indirectly) from AndroidX's FragmentActivity or Fragment, respectively, then it implements `LifecycleOwner`. In this case, you can simply register your Activity's or Fragment's lifecycle by adding the following line in its `onCreate()` method: ```js FlowplayerLifecycleObserver.registerLifecycle(lifecycle) ``` 2. If your Activity or Fragment does not implement `LifecycleOwner`, then you must call the `FlowplayerView`'s lifecycle methods manually by putting the following code inside the parent Activity or Fragment: ```js override fun onStart() { super.onStart() flowplayerView.onStart() } override fun onResume() { super.onResume() flowplayerView.onResume() } override fun onPause() { flowplayerView.onPause() super.onPause() } override fun onStop() { flowplayerView.onStop() super.onStop() } override fun onDestroy() { flowplayerView.onDestroy() super.onDestroy() } ``` ### Option 2: Add FlowplayerFragment or FlowplayerSupportFragment Both `FlowplayerFragment` and `FlowplayerSupportFragment` can be added in the same way as any other Fragment, either via xml: ```xml ``` or programmatically: ```js val playerFragment = FlowplayerFragment.newInstance() fragmentManager.beginTransaction() .replace(R.id.player_holder, playerFragment) .commit() ``` You can then get the instance of the `FlowplayerView` by calling: ```js playerFragment.getPlayer() ``` Info If you add the Fragment programmatically and you want to immediately get the player's instance, then before `playerFragment.getPlayer()` you first need to call `fragmentManager.executePendingTransactions()`. That's because the `.commit()` that you called earlier, will commit the transaction asynchronously. ## Prepare the player `FlowplayerView` can play media directly from a media URL that you specify. The player can be prepared with a local or remote media URL. This is possible by preparing the player with an `ExternalMedia` instance as shown below. An `ExternalMedia` may optionally contain an ad schedule as well. ```js val externalMedia = ExternalMedia("https://link.to.a.media.file") flowplayerView.prepare(externalMedia, true) ```