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.
中亲自测试过代码
情况:
我有一个 '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.
中亲自测试过代码