情况:
我有一个带有静态方法的“帮助程序”类,用于动态启用/禁用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);
}
}
同样,我计划从另一个类中调用这些方法。
执行此操作并正确分配所有内容的正确方法是什么?
答案 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
类的成员,并从static
和recieverRegister
中删除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中测试过代码。