我正在围绕ExoPlayer编写包装器作为自定义视图。目标是为我们的流和广告逻辑创建一个非常简单的抽象,以便我们可以将JAR文件分发给客户端,并且他们可以将“ BFPlayer”拖放到其自定义应用中,将ID交给引用其中一个广播,一切都会像魔术一样播放。
由于每当活动暂停或停止时都需要释放ExoPlayer,因此,如果可能的话,我想自动执行此操作。我想检测父活动何时被暂停,释放ExoPlayer,然后检测何时未暂停,静默启动新的ExoPlayer并恢复先前的状态。
我发现了this StackOverflow post, describing how to get the hosting Activity from a View,但是一旦有了活动,我就不知道一种方法来注册一个在活动暂停时自动运行的功能。
答案 0 :(得分:1)
在活动中,您可以实现一种方法,以允许视图订阅生命周期事件,如下所示:
让事件监听器
interface LifeCycleListener {
fun onPause()
fun onResume()
}
允许观看事件以订阅事件
private var mListener: LifeCycleListener? = null
fun subscribeToLifecycleEvents(listener: LifeCycleListener) {
mListener = listener
}
在活动方法中,调用侦听器
override protected final fun onPause() {
mListener?.onPause()
super.onPause()
}
override protected final fun onResume() {
super.onResume();
mListener?.onResume()
}
然后让您的视图实现LifeCycleListener
并在您获得活动后调用subscribe函数
答案 1 :(得分:1)
只想添加我为此发现的另一种解决方案,可能会更干净一些。您可以让View
实现LifecycleListener
接口,然后在活动中调用getLifecycle().addListener(view)
:
Activity.java :
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
MyView myView = findViewById(R.id.myView);
getLifecycle().addObserver(myView);
}
}
View.java :
public class MyView extends View implements LifecycleListener {
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.i("LIFECYCLE EVENT", "Activity was paused");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.i("LIFECYCLE EVENT", "Activity was resumed");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.i("LIFECYCLE EVENT", "Activity was stopped");
}
}
我喜欢这种解决方案,因为它使必须添加到活动中的代码量减至最少-减少了将库实现为必须粘贴到的另一行的成本,而不必声明多个生命周期方法并委托给手动查看。