自定义视图是否可以检测其“活动”被暂停或停止的时间?

时间:2019-05-10 15:54:24

标签: android

我正在围绕ExoPlayer编写包装器作为自定义视图。目标是为我们的流和广告逻辑创建一个非常简单的抽象,以便我们可以将JAR文件分发给客户端,并且他们可以将“ BFPlayer”拖放到其自定义应用中,将ID交给引用其中一个广播,一切都会像魔术一样播放。

由于每当活动暂停或停止时都需要释放ExoPlayer,因此,如果可能的话,我想自动执行此操作。我想检测父活动何时被暂停,释放ExoPlayer,然后检测何时未暂停,静默启动新的ExoPlayer并恢复先前的状态。

我发现了this StackOverflow post, describing how to get the hosting Activity from a View,但是一旦有了活动,我就不知道一种方法来注册一个在活动暂停时自动运行的功能。

2 个答案:

答案 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");
    }
}

我喜欢这种解决方案,因为它使必须添加到活动中的代码量减至最少-减少了将库实现为必须粘贴到的另一行的成本,而不必声明多个生命周期方法并委托给手动查看。