Android-使用带有静态方法的Helper类动态注册/注销接收器?

时间:2019-03-07 19:27:12

标签: java android broadcastreceiver android-broadcastreceiver

情况:
我有一个带有静态方法的“帮助程序”类,用于动态启用/禁用BroadcastReceiver。
当我需要注册(或注销)Receiver时,可以从其他类中调用这些方法。

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

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


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

    }


}


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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以通过将intentFilter设为GpsReceiverHelper类的成员,并从staticrecieverRegister中删除receiverUnregister关键字来封装过程。

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

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

用法示例:

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

上面的助手现在可以在每个班级使用,例如<NameOfTheCLass>.helper

免责声明:我从未亲自在实际的IDE中测试过代码。

相关问题