【问题标题】:Why is my Receiver not Receiving Broadcast?为什么我的接收器没有接收到广播?
【发布时间】:2012-11-16 04:43:29
【问题描述】:

我在使用/理解 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"
    }
    ...

【问题讨论】:

  • 发布异常堆栈
  • 请使用 LogCat 并查看与您的“错误”相关的堆栈跟踪。如果您不理解,请复制并通过上面的“编辑”链接将其粘贴到您的问题中。

标签: android broadcastreceiver intentfilter android-pendingintent proximity


【解决方案1】:

Test 扩展了广播接收器,因此必须通知广播才能激活。你确定那是你想做的吗?

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

【讨论】:

  • @thedeepfield 是否有任何答案符合您的要求?
  • 感谢您的赏金,但您也可以接受答案吗?
【解决方案2】:

您好,在您的活动(或服务)下使用 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);

添加您想要接收的所有操作。 您的代码不起作用,因为您在另一个内部使用广播,我认为这不是您想要的。

【讨论】:

    【解决方案3】:

    您可以简单地同时注册两个 BroadcastReceiver 并控制启用,通过简单的方法禁用它们,例如

    • 使用静态/非静态布尔变量
    • 使用首选项保存键值

    例如:

    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"
        }
        ...
    

    【讨论】:

      【解决方案4】:

      我能够通过在 android 清单中注册接收器来使其工作,而不是尝试在 test1 中动态注册接收器。这个网站真的很有帮助:

      http://www.techotopia.com/index.php/Android_Broadcast_Intents_and_Broadcast_Receivers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多