場合によっては、サード パーティ ライブラリからブロードキャストを受信する際に問題が発生することがあります。
(特定のアクティビティが有効な場合のみ、ブロードキャストを気にします。)
1 つの使用例は (「アクティビティを有効にしない」をオンにした場合)、アクティビティでサード パーツ ライブラリから別のアクティビティを開始します。
現在のアクティビティは、新しいアクティビティが終了するまで一時的に破棄されます (最初のアクティビティは os によって再作成されます)。
2 番目のアクティビティ (3 番目の部分のライブラリ) では、ブロードキャストを行います。最初のアクティビティはレシーバーを登録しましたが、その onDestroy() でレシーバーが登録解除されたため、ブロードキャストに失敗しました。
同様のケースのライブデータをサポートできる新しいアンドロイドアーチライフサイクルを見ました。ここで適用できるかどうかはわかりません (問題はアクティビティ コンテキストにある可能性があります)。
これは私が思うことです:
LifecycleRegistryOwner から拡張されたアクティビティでは、アクティビティのライフサイクルを監視します。アクティビティはOSによって破棄および再作成される可能性があることを理解していますが(構成変更時など、実際には破棄されていません)、LifecycleRegistryは、アクティビティが本当に破棄された時期を通知します(OSが後で再作成するものではありません)。
したがって、LifecycleRegistryOwner の助けを借りて、LifecycleRegistryOwner によって管理されるライフサイクルで、アクティビティの真の寿命の間、一部のデータを存続させることができます。
問題は、LifecycleRegistryOwner のみのライフ サイクル (真のアクティビティ ライフ) で生きたいブロードキャスト レシーバーがある場合、lifeCycleObser の onStart() でレシーバーを登録し、その onDestroy( で登録を解除することは可能ですか? )? 問題は、受信者を登録するためにこのアクティビティが必要なことです。
アクティビティが破棄されて再作成される可能性があるため、アクティビティの実際の寿命を監視する TheLifeCycleObserver に 1 つのアクティビティ インスタンスを保持するべきではありません。
しかし、レシーバーが常にブロードキャストを受信し (OS がアクティビティを一時的に破棄し、すぐに再作成する場合でも)、この特定のアクティビティが本当に破棄された場合に登録されない場合の解決策は何ですか?
クラスのスニペットを以下に示します。
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) {
…………
}
}