Android - Register/Unregister Receiver 动态使用 Helper Class 和静态方法?

Android - Register/Unregister Receiver Dynamically using a Helper Class with Static Methods?

情况:
我有一个 'helper' class 静态方法,动态 enable/disable 一个 BroadcastReceiver.
当我需要注册(或)取消注册接收器时,我从其他 classes 调用这些方法。

问题:
我不知道如何动态 UN 从助手 class..
中注册接收器 (当我尝试执行 context.unregisterReceiver(myReceiver); 时,它无法识别 myReceiver)。

问题:
如何从下面代码中的 receiverUnregister 方法正确引用 myReceiver


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

    }


}


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

您必须保留对您注册的所有接收者的引用。您可以通过不同的方式执行此操作。一种方法是使用一个静态集合将它们保存在这个助手 class 中(不是最好的方法)。另一种方法是在 receiverRegister 方法中 return 接收器。这样,无论谁调用该方法,都必须维护引用,然后再使用它来注销。

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

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

我设法通过为 static BroadcastReceiver myReceiver 添加 Field 条目然后在包含实际 BroadcastReceiver 代码的静态方法中像 myReceiver= ... 一样分配它来解决我的问题。此外,我意识到我可以避免BroadcastReceiver 在调用 finish(); 时被杀死,只需将 context.registerReceiver 替换为 context.getApplicationContext.registerReceiver。问题已解决!

您可以通过使 intentFilter 成为 GpsReceiverHelper class 的成员并基本上从 recieverRegister 和 [=16] 中删除 static 关键字来封装该过程=].

public class GpsReceiverHelper {

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

    //  Called from a different Class when I need to Register the Receiver
    public void receiverRegister(Context context) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.location.PROVIDERS_CHANGED");
        context.registerReceiver(myReceiver, intentFilter);
    }

    //  Called from a different Class when I need to UN-Register the Receiver
    public void receiverUnregister(Context context) {
        context.unregisterReceiver(myReceiver);
    }
}

上面的代码现在是一个真正的助手 class 而不仅仅是一个带有一堆静态方法的实用程序 class。

用法示例:

class TestActivity extends Activity{
  private GpsRecieverHelper helper = new GpsRecieverHelper();

  public void onStart(){
      helper.receiverRegister(this);
  }

  public void onStop(){
      helper.receiverUnregister(this);
  }
}

如果您需要重复使用助手的同一个实例,您可以使用 public static 关键字:

public static GpsRecieverHelper helper = new GpsRecieverHelper();

上面的帮助程序现在可以在每个 class 中访问,例如<NameOfTheCLass>.helper.

免责声明:我从未在实际 IDE.

中亲自测试过代码