在某些情况下,从第三部分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) {
…………
}
}