Как использовать LifecycleRegistryOwner, чтобы поддерживать приемник вещания только тогда, когда активность активна

Возникли проблемы с получением трансляции из третьей части lib в некоторых случаях.

(заботиться о трансляции только тогда, когда конкретная деятельность жива.)

Один из вариантов использования (при включении "Не поддерживать активность") в этом упражнении запускает другое действие из третьей части lib.

Текущее действие будет временно уничтожено до завершения нового действия (первое действие будет воссоздано ОС).

Во втором упражнении (какая-то третья часть lib) он вещает. Первое действие зарегистрировало получателя, но в его onDestroy() получатель отменил регистрацию, поэтому он пропустил трансляцию.

Увидел новый Android-Arch-Lifecycle, который может поддерживать живые данные для аналогичного случая. Не уверен, что это может быть применимо здесь (проблема может быть с контекстом активности).

Вот что я думаю:

В действии, которое выходит из LifecycleRegistryOwner, оно будет наблюдать за жизненным циклом действия. Как вы понимаете, действие может быть уничтожено и воссоздано с помощью os (например, при изменении конфигурации, но не уничтожено), но LifecycleRegistry сообщит, когда действие действительно уничтожено (а не те, которые os будет воссоздавать позже).

Таким образом, с помощью LifecycleRegistryOwner он может сохранить некоторые данные в жизненном цикле, управляемом LifecycleRegistryOwner, для истинного жизненного цикла действия.

Вопрос в том, есть ли широковещательный приемник, который хотел бы жить только с жизненным циклом только LifecycleRegistryOwner (истинная жизнь активности), возможно ли выполнить регистрацию получателя в onCart() функции lifeCycleObser и отменить регистрацию в его 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 ответов

Другие вопросы по тегам