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)
        ......
    }
    ......
}