【问题标题】:Android Communication between Broadcast Receiver and MainActivity (Send data to activity)Android Broadcast Receiver和MainActivity之间的通信(向Activity发送数据)
【发布时间】:2010-11-09 10:00:49
【问题描述】:

我有一个简单的 Main Activity,它必须停止直到收到 SMS...如何在 BroadcastReceiveronReceive() 方法中从 MainActivity 启动方法?

有没有信号和等待?我可以通过待处理的Intent 传递一些东西,或者我该如何实现这种通信?

【问题讨论】:

    标签: android android-activity sdk broadcast


    【解决方案1】:

    从 BroadcastReceiver 到 Activity 的通信很棘手;如果活动已经消失了怎么办?

    如果我是你,我会在 Activity 中设置一个新的 BroadcastReceiver,它会收到一条 CLOSE 消息:

    private BroadcastReceiver closeReceiver;
    // ...
    closeReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
    
      //EDIT: receiving parameters
      String value = getIntent().getStringExtra("name"); 
      //... do something with value
    
      finish();
      }
    };
    registerReceiver(closeReceiver, new IntentFilter(CLOSE_ACTION));
    

    然后你可以从 SMS BroadcastReceiver 发出这个动作:

    Intent i = new Intent(CLOSE_ACTION);
    i.putExtra("name", "value"); //EDIT: this passes a parameter to the receiver
    context.sendBroadcast(i);
    

    我希望这会有所帮助?

    【讨论】:

    • Mhm...我在 Manifest 中直接注册 Receiver...并且需要与 Receiver 交换数据...
    • 没问题。可以使用 Extras 发送数据。 i.putExtra("名称", "值");但是只能传递原始类型。
    • 快速修复:context.sendBroadcast(i); 它必须使用 BroadcastReceiver 上下文来传播意图。
    【解决方案2】:

    我遇到了完全相同的问题,我尝试使用意图但我没有成功

    使用它最简单的方法是使用静态方法和静态变量

    MainActivity.java

    public static void stopsms()
    {
    
    /*
    some code to stop the activity
    
    */
    
    }
    

    SMSReceiver.java

    最后调用这个函数

    MainActivity.stopsms();
    

    如果您的代码不影响您使用静态方法和变量时,效果会非常好。如果您需要任何帮助,请告诉我。

    【讨论】:

    • 有没有办法从那个静态 void 函数访问 mainactivity 上下文?
    • 这不危险吗,在活动上调用静态方法?如果活动不再存在怎么办?
    【解决方案3】:

    然而,在活动中注册第二个接收器的问题是它不会像在清单中注册那样持久......因此,虽然这个解决方案可能有效,但只有当活动在后台运行时才会有效.

    【讨论】:

    • 这似乎更适合作为评论而不是答案。
    【解决方案4】:

    很简单,使用这样的界面:

    1) 在你的广播接收器中创建一个接口。

    public interface ChangeListener{
        public void functionWhoSendData(String type);
        public void etc();
    }
    

    并在您的广播接收器中实例化该接口,使用它:

    public void onReceive(....
        String data=functionWhereYouReceiveYouData();
        ChangeListener.functionWhoSendData(data);
    }
    

    在你的活动中,让它实现你的界面

    【讨论】:

    • 当我这样做时,我得到了 ClassCastException。显然 onReceive 中的上下文无法转换为接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多