Как использовать 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) {
…………
}
}