Java 在应用程序类中注册时存在广播接收器泄漏的风险
我正在应用程序的应用程序类“Java 在应用程序类中注册时存在广播接收器泄漏的风险,java,android,android-activity,broadcastreceiver,android-application-class,Java,Android,Android Activity,Broadcastreceiver,Android Application Class,我正在应用程序的应用程序类“onCreate()中注册广播接收器。只要应用程序的进程处于活动状态,我基本上希望接收器处于活动状态。在这个was中,触发应用程序的任何组件都将导致接收器自动注册,并且只要进程处于活动状态,就不会被销毁,因为我当时在应用程序类中注册了该组件。 应用程序类 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "Registering broadcast
onCreate()
中注册广播接收器。只要应用程序的进程处于活动状态,我基本上希望接收器处于活动状态。在这个was中,触发应用程序的任何组件都将导致接收器自动注册,并且只要进程处于活动状态,就不会被销毁,因为我当时在应用程序类中注册了该组件。应用程序类
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Registering broadcast receivers");
final Context context = getApplicationContext();
MyReceiver.register(context);
}
广播接收器类别:
public class MyReceiver extends BroadcastReceiver {
public static void register(final Context context) {
final IntentFilter intentFilter = new IntentFilter("My Action");
final BroadcastReceiver receiver = new MyReceiver();
context.registerReceiver(receiver, intentFilter);
}
}
我在文档中读到,为了防止接收器泄漏,我们应该在我们正在注册的相应生命周期方法中注销接收器。但是文档中提到了在活动
类中注册接收者。
在
应用程序
类中注册接收者是否也同样适用?这里的区别似乎是,即使某个活动被破坏,应用程序进程仍处于活动状态,因此泄漏是有意义的。但是,如果我在应用程序类中注册,我希望我的接收者注销的唯一时间是进程终止时。流程终止后是否存在泄漏的可能性?可以采用以下解决方案:
创建一个新类并实现应用程序。ActivityLifecycleCallbacks
。
我们正在寻找的方法是onactivitypused
和onActivityResumed
,因此任何其他方法都可以为空
基本上,我们希望广播接收器在活动(wichever活动)恢复时注册,在活动暂停时取消注册
类的构造函数应该具有对应用程序类的引用和对广播接收器的引用(可以使用依赖项注入传递它们)
在本例中,我正在检查网络连接,有一个活动我不想注册广播接收器(ActivityDialog
)
因此,每当一个活动出现时,它都会注册广播接收器,当它消失时,广播接收器将被取消注册
应用程序类应类似于:
class MyApplication : Application() {
private var networkReceiver: BroadcastReceiver? = null
private lateinit var lcApplication: LifeCycleApplication
override fun onCreate() {
super.onCreate()
/** network connection in background **/
networkReceiver = NetworkReceiver()
lcApplication = LifeCycleApplication(this, networkReceiver!!)
registerActivityLifecycleCallbacks(lcApplication)
......
}
......
}
为什么要这样做?因为应用程序类只有OnCreate
方法。
有关更多信息,请查看android开发者网页文档
我希望这能对你有所帮助。是的,你说得对。通常情况下,接收者应取消注册。根据您的需求,您应该处理它,始终记住在活动的onStop()中调用unregister receiver。如果广播接收器已在onCreate()中注册,则当应用程序进入后台并再次恢复时,接收器将不会再次注册。因此,最好在活动的onStart()或onResume()中注册broadcastReceiver,并在onStop()中注销。通常,如果您想要这种行为,您应该在应用程序启动时启动的服务中注册并注销接收者。我是在应用程序
类中注册接收者,而不是在活动
类中注册接收者<代码>应用程序
类不提供onDestroy()
回调,所以我不确定如何处理它。我想知道,不注销在应用程序中注册的广播是否存在任何风险?
class MyApplication : Application() {
private var networkReceiver: BroadcastReceiver? = null
private lateinit var lcApplication: LifeCycleApplication
override fun onCreate() {
super.onCreate()
/** network connection in background **/
networkReceiver = NetworkReceiver()
lcApplication = LifeCycleApplication(this, networkReceiver!!)
registerActivityLifecycleCallbacks(lcApplication)
......
}
......
}