0

在某些情况下,从第三方库接收广播时遇到问题。

(仅在特定活动处于活动状态时才关心广播。)

一个用例是(当打开“不要让活动保持活动状态”时),在活动中它会从第三方库中午餐另一个活动。

当前活动将被暂时销毁,直到新活动完成(第一个活动将由操作系统重新创建)。

在第二个活动(一些第三方库)中,它进行广播。第一个活动注册了接收者,但在其 onDestroy() 中,接收者未注册,因此它错过了广播。

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

这就是我的想法:

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

因此,在 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) {
               …………
        }
  }
4

0 回答 0