0

我正在应用程序的 Application 类中注册广播接收器' onCreate()。只要应用程序的进程处于活动状态,我基本上希望接收器处于活动状态。在这种情况下,应用程序的任何组件被触发都会导致接收器自动注册,并且只要进程还活着,就不会被销毁,因为我当时在 Application 类中注册。
应用类

@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);
    }
}

我在文档中读到,为了防止接收器泄漏,我们应该在我们正在注册的那个的相应生命周期方法中取消注册接收器。但是文档讨论了在Activity类中注册接收器。这同样适用于在Application课堂上注册接收者吗?这里的区别似乎是即使活动被破坏,应用程序进程仍然处于活动状态,因此泄漏是有意义的。但是,如果我在Application课堂上注册,我唯一希望我的接收器取消注册的时间是进程被终止时。进程终止后是否有泄漏的可能性?

4

1 回答 1

1

可能是您可以实施的解决方案如下:

创建一个新类并实现Application.ActivityLifecycleCallbacks. 我们正在寻找的方法是onActivityPausedonActivityResumed因此任何其他方法都可以为空。

基本上,我们希望广播接收器在活动(无论活动)处于恢复状态时进行注册,并在活动暂停时取消注册。

该类的构造函数应该具有对 Application 类的引用和对广播接收器的引用(您可以使用依赖注入传递它们)。

在此示例中,我正在检查网络连接,并且有一个我不想注册广播接收器的活动 ( ActivityDialog)

class LifeCycleApplication(
    private val applicationReference: Application,
    private val networkReceiver: BroadcastReceiver
) : Application.ActivityLifecycleCallbacks {

    override fun onActivityPaused(activity: Activity?) {
        if (activity !is ActivityDialog) {
            println("Broadcast down")
            applicationReference.unregisterReceiver(networkReceiver)
        }
    }

    override fun onActivityStopped(activity: Activity?) {
        // on stop
    }

    override fun onActivityResumed(activity: Activity?) {
        if (activity !is ActivityDialog) {
            println("Broadcast up")
            applicationReference.registerReceiver(networkReceiver, IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))
        }

    }

    override fun onActivityStarted(activity: Activity?) {

    }
    ......
}

因此,每次活动出现时,它都会注册广播接收器,而当消失时,广播接收器将被注销。

Application 类应类似于:

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

为什么采用这种方法?因为Application类只有OnCreate方法。有关更多信息,请查看android 开发者网页文档的此链接。

我希望这可以帮助你。

于 2019-08-06T23:08:25.210 回答