1

我很难使用/理解BroadcastReceivers和IntentFilters。我的测试活动中有以下代码。测试活动包含一个.addProximityAlert,如果.addProximityAlert被触发,我想广播到Test2接收器。我测试这个时发生错误。我究竟做错了什么?为什么我的接收器不接收广播?

测试活动:

public class Test extends BroadcastReceiver 
{ 
    LocationManager lm; 
    ... 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     ... 
     final String PROX_ALERT_INTENT = "com.example.proxalert.Test2"; 
     Intent alert = new Intent(PROX_ALERT_INTENT); 
     PendingIntent proximityIntent = PendingIntent.getBroadcast(context, 0, alert, 0); 

     lm.addProximityAlert(latitude, longitude, radius, expiration, proximityIntent); 

     IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT); 
     context.registerReceiver(new Test2(), filter); 

Test2的接收机:

public class Test2 extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
    String key = LocationManager.KEY_PROXIMITY_ENTERING; 
     Boolean entering = arg1.getBooleanExtra(key, false); 
     if (entering) { 
     //toast notification "welcome" 
    } 
    ... 
+1

后的异常堆栈 – Atrix1987

+1

请使用logcat的,看你的“错误”相关的堆栈跟踪。如果您不明白,请将其复制并通过上面的“编辑”链接粘贴到您的问题中。 – CommonsWare

回答

2

测试延伸广播接收机,所以它必须被通知广播的得到激活。你确定这就是你想要做的?

它真的是一个测试Android?我不这么认为。因此,如果您只是要使用该代码移除Test类,请使用按钮创建一个活动,然后在单击该按钮时在Test中执行您的代码。

+0

@thedeepfield做了任何答案符合您的要求? – Snicolas

+0

谢谢你的赏金,但你能接受答案吗? – Snicolas

1

喜用BroadcastReceivers和IntentFilters给你这样的活动(或服务)下:

   broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver 
      @Override 
      public void onReceive(Context context, Intent intent) { 

       String action = intent.getAction(); 
       //Action receive 
      }; 

意图过滤器:

 IntentFilter intentfilterTime = new IntentFilter(); 
     intentfilterTime.addAction(Intent.ACTION_BATTERY_CHANGED);//receive battery level change 
     registerReceiver(broadcastReceiver, intentfilterTime); 

添加要接收所有行动。 你的代码不起作用,因为你在另一个里面使用广播我不认为这是你想要的。

1

你可以简单地在同一时间和控制寄存器二者的广播接收器的实现,通过简单的方法,像

  • 禁用它们使用静态/非静态布尔变量
  • 使用偏好持有键值

例如:

public class Test extends BroadcastReceiver 
{ 
    LocationManager lm; 
    ... 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ... 
      final String PROX_ALERT_INTENT = "com.example.proxalert.Test2"; 
     Intent alert = new Intent(PROX_ALERT_INTENT); 
     PendingIntent proximityIntent = PendingIntent.getBroadcast(context, 0, alert, 0); 

     lm.addProximityAlert(latitude, longitude, radius, expiration, proximityIntent); 

     IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT); 
     Test2.someStaticVariable = true; 


public class Test2 extends BroadcastReceiver { 
    public static boolean someStaticVariable; 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 

    if (!someStaticVariable){ 
     return; 
    } 

    String key = LocationManager.KEY_PROXIMITY_ENTERING; 
     Boolean entering = arg1.getBooleanExtra(key, false); 
     if (entering) { 
     //toast notification "welcome" 
    } 
    ...