如何使用LifecycleRegistryOwner仅在活动处于活动状态时才使广播接收器保持活动状态

时间:2017-09-16 20:18:45

标签: android android-broadcastreceiver android-architecture-lifecycle

在某些情况下,从第三部分lib接收广播有一些问题。

(仅在特定活动存活时关注广播。)

一个用例是(当打开'不要保持活动活着)时,在活动中它从第三部分lib中获取另一个活动。

当前活动将暂时销毁,直到新活动结束(第一个活动将由os重新创建)。

在第二个活动(第三部分lib)中,它进行广播。第一个活动已注册接收器,但在其onDestroy()中,接收器是取消注册的,因此它错过了广播。

看到新的android arch-lifecycle可以支持类似案例的实时数据。不确定它是否可以在这里应用(问题可能在于活动上下文)。

这就是我的想法:

在从LifecycleRegistryOwner扩展的活动中,它将观察活动的生命周期。 据了解,os可以销毁和重新创建活动(例如在配置更改时,而不是真正销毁),但LifecycleRegistry将告诉活动何时真正被破坏(而不是os将在以后重新创建它)。

因此,在LifecycleRegistryOwner的帮助下,它可以在LifecycleRegistryOwner管理的生命周期中保留一些数据,以保证活动的真实寿命。

问题是,如果有一个广播接收器只想生命周期的LifecycleRegistryOwner(真正的活动生命周期),是否可以在lifeCycleObser的onStart()中注册接收器并取消注册它是onDestroy()?问题是它需要这个活动来注册接收器。

感觉就像活动可以被销毁和重新创建一样,它不应该在TheLifeCycleObserver中保留一个活动实例,它会观察活动的真实寿命。

但是,如果希望接收器始终接收广播(即使操作系统暂时销毁活动并很快再次重新创建它),如果这个特定活动真的被破坏,那么解决方案是什么?

下面列出了类代码段:

TheLifeCycleObserver,TheBroadcastReceiver和MainActivity

class TheLifeCycleObserver(private var lifecycle: LifecycleRegistry?, private var lifeCycleChangeListener: OnLifeCycleChange?) : LifecycleObserver {


interface OnLifeCycleChange {
    fun onStart()
    fun onDestroy()
}

init {

}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
    lifeCycleChangeListener!!.onStart()
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
    lifeCycleChangeListener!!.onDestroy()
}

}

class MainActivity : AppCompatActivity(), LifecycleRegistryOwner {

    private val mRegistry: LifecycleRegistry = LifecycleRegistry(this);
        override fun getLifecycle() : LifecycleRegistry {
        return mRegistry
    }

    private var theLifeCycleObserver: TheLifeCycleObserve? = null

    fun setupLifeCycleObserver() {

        theLifeCycleObserver = TheLifeCycleObserve(lifecycle, object : TheLifeCycleObserve.OnLifeCycleChange {
            override fun onStart() {

            registerReceiver(this@MainActivity)  //<== can we do it here the pass the activity as context, and the activity could be temporarily destroyed in some time ???

        }

        override fun onDestroy() {

            if (theReceiver != null) {
                this@MainActivity.unregisterReceiver(mASDKBroadcastReceiver);
                theReceiver = null;
            }

            lifecycle.removeObserver(theLifeCycleObserver)
        }

        })

        lifecycle.addObserver(theLifeCycleObserver)
    }

    var theReceiver: TheBroadcastReceiver? = null

    fun registerReceiver(context: Context) {

        if (theReceiver == null) {
            theReceiver = TheBroadcastReceiver(mActivity.getApplicationContext())
        }

        val theIntentFilter = IntentFilter()
        theIntentFilter.addAction(CustomIntent.ACTION_ONE)
        theIntentFilter.addAction(CustomIntent.ACTION_TWO)
        theIntentFilter.addAction(CustomIntent.ACTION_THREE)

        // here the context is the activity, can it live with the TheLifeCycleObserve???

        context.registerReceiver(mASDKBroadcastReceiver, theIntentFilter)

    }

 }



 class TheBroadcastReceiver extends BroadcastReceiver {

        // need the activity's context for some other operation inside the onReceive()

        private final Context mAppContext;

        public TheBroadcastReceiver(@NonNull Context context) {
            mAppContext = context.getApplicationContext();
        }

        @Override
        public void onReceive(Context context, Intent intent) {
               …………
        }
  }

0 个答案:

没有答案