在某些情况下,从第三方库接收广播时遇到问题。
(仅在特定活动处于活动状态时才关心广播。)
一个用例是(当打开“不要让活动保持活动状态”时),在活动中它会从第三方库中午餐另一个活动。
当前活动将被暂时销毁,直到新活动完成(第一个活动将由操作系统重新创建)。
在第二个活动(一些第三方库)中,它进行广播。第一个活动注册了接收者,但在其 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) {
…………
}
}