【问题标题】:SendOrderedBroadcast issue: recevied intent is the sent oneSendOrderedBroadcast 问题:收到的意图是发送的
【发布时间】:2019-07-15 15:54:50
【问题描述】:

当我调用 sendOrderedBroadcast 方法时,传递给 onReceive 的 Intent 与我发送的完全相同。

Intent intent = new Intent(Action.ACTION);
context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent1) {
        String action = intent1.getAction();
        //action is still Action.ACTION
        if(!action.equals(Action.DIFFERENT_ACTION)) {
            return;
        }
        assertEquals(Action.DIFFERENT_ACTION, action);
        Bundle bundle1 = intent1.getExtras();
        assertEquals(bundle1.getString(ExtraConstants.TYPE), ExtraConstants.MONITOR);
    }
}, null, Activity.RESULT_OK, null, null);

甚至使用 setResult 方法返回包也无济于事。 预期的接收者也能够接收意图并正确使用它,但我找不到从该接收者回复的方法。 有什么想法吗?

EDIT-1

我正在测试我的广播接收器 [让我们称之为 BR1] 使用 robolectric 动态注册。在这段代码中,我向 BR1 发送了一个意图,我希望 BR1 设置一个结果,以便由 sn-p 中的 BroadcastReceiver 接收(我们称之为 BR2)。所发生的情况是,发送给 BR1 的意图也被 BR2 接收,而不再被调用

EDIT-2 我在一个独立的 Android 应用程序中尝试同样的事情,你可以找到代码

public class MyActivity extends AppCompatActivity {
    @Override
    public void onStart() {
        super.onStart();
        MyReceiver receiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("call.br.my");
        this.registerReceiver(receiver, intentFilter);
    }

    public void sendMessage(View view) {
        Intent intent = new Intent("call.br.my");
        intent.putExtra("hello", "ciao");
        sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if(intent.getStringExtra("hello") != null) {
                    return;
                }
                log.info(intent.getStringExtra("ciao"));
            }
        }, null, Activity.RESULT_OK, null, null);
    }
}

public class MyReceiver extends BroadcastReceiver {

    private static final Logger log = Logger.getLogger(MyReceiver.class.getName());

    @Override
    public void onReceive(Context context, Intent intent) {

        log.info(intent.getStringExtra("hello"));
        Bundle bundle = new Bundle();
        bundle.putString("ciao", "hello1");
        setResult(Activity.RESULT_OK, "ciao", bundle);
    }
}

但是sendOrderedBroadcast中声明的BroadcastReceiver没有接收到放在bundle中的字符串,它只能接收发送的intent。

【问题讨论】:

  • “我找不到从那个收件人那里回复的方法”——call setResult() 或相关方法(例如,setResultExtras())。
  • 我做到了,使用 setResult(Activity.RESULT_OK, null, bundle),但它不起作用,我是否必须在 setResult 之后调用其他东西?
  • 我不这么认为。我没有使用这个六参数sendOrderedBroadcast() 并尝试得到结果。您确定您的接收器正在获得控制权并且它的setResult() 被调用了吗?此外,您可以尝试在您的sendOrderedBroadcast() 调用中传递Activity.RESULT_CANCELED 而不是Activity.RESULT_OK,看看这是否对结果有任何影响。
  • 我已经编辑了我的问题,那里有更多细节。
  • 将你的代码扔到一个废弃的 Android Studio 项目中并尝试直接使用它,而不是在测试中使用 Robolectric。或者,也许可以尝试将其作为仪器测试。您可能遇到了 Robolectric 限制或错误。

标签: android android-intent broadcastreceiver


【解决方案1】:

在您获得结果的 BroadcastReceiver 中,您不直接使用 intent 参数,而是必须调用 getResultExtras()

例如在 Kotlin 中:

val resultExtras = getResultExtras(true)

然后您可以通过 resultExtras 获取您设置的任何捆绑/额外数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2018-08-30
    • 2012-03-13
    相关资源
    最近更新 更多