首页 > 解决方案 > Android - 使用具有静态方法的助手类动态注册/取消注册接收器?

问题描述

情况:
我有一个带有静态方法的“助手”类,可以动态启用/禁用广播接收器。
当我需要注册(或)注销接收器时,我会从其他类调用这些方法。

问题:
我不知道如何从帮助类中动态地联合国
注册接收器.. (当我尝试这样做context.unregisterReceiver(myReceiver);时它无法识别myReceiver)。

问题:
如何正确引用下面代码中myReceiverreceiverUnregister方法?


public class GpsReceiverHelper {


    //  Called from a different Class when I need to Register the Receiver
    public static void receiverRegister(Context context) {

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.location.PROVIDERS_CHANGED");

        final BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //  Receiver code goes here    
            }
        };
        context.registerReceiver(myReceiver, intentFilter);
    }



    //  Called from a different Class when I need to UN-Register the Receiver
    public static void receiverUnregister(Context context) {

        //  THIS DOESN'T WORK BECAUSE "myReceiver" can't be found..
        context.unregisterReceiver(myReceiver);

    }


}


同样,我计划在不同的类中调用这些方法。
执行此操作并正确分配所有内容的正确方法是什么?

标签: javaandroidbroadcastreceiverandroid-broadcastreceiver

解决方案


您必须保留对您注册的所有接收者的引用。你可以用不同的方式做到这一点。一种方法是拥有一个静态集合,将它们保存在这个助手类中(不是最好的方法)。另一种方法是在您的方法中返回接收器receiverRegister。这样,调用该方法的任何人都必须维护引用,然后使用它来取消注册。

public BroadcastReceiver registerReceiver(...) {
  ...
  return receiver;
}

public void unregisterReceiver(Context context, BroadcastReceiver receiver) {
  context.unregisterReceiver(receiver);
}

推荐阅读