【发布时间】: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